makefile中的特殊符号及关键字

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

makefile中的特殊符号及关键字
1.常见⾃动变量和含义
* :表⽰⽬标⽂件的名称,不包含⽬标⽂件的扩展名。

+ :表⽰所有的依赖⽂件,这些依赖⽂件之间以空格分开,按照出现的先后为顺序,其中可能包含重复的依赖⽂件。

< :表⽰依赖项中第⼀个依赖⽂件的名称
:依赖项中,所有⽬标⽂件时间戳晚的⽂件(表⽰修改过),依赖⽂件间以空格分开
@ :⽬标项中⽬标⽂件的名称
^ :依赖项中,所有不重复的依赖⽂件,以空格分开。

2.预定义变量
Makefile中常⽤的变量及含义
AR⽣成静态库库⽂件的程序名称ar
AS汇编编译器的名称as
CC C语⾔编译器的名称cc
CPP C语⾔预编译器的名称$(CC) -E
CXX C++语⾔编译器的名称g++
FC FORTRAN语⾔编译器的名称f77
RM删除⽂件程序的名称rm -f
ARFLAGS⽣成静态库库⽂件程序的选项⽆默认值
ASFLAGS汇编语⾔编译器的编译选项⽆默认值
CFLAGS C语⾔编译器的编译选项⽆默认值
CPPFLAGS C语⾔预编译器的编译选项⽆默认值
CXXFLAGS C++语⾔编译器的编译选项⽆默认值
FFLAGS FORTRAN语⾔编译器的编译选项⽆默认值
3.设置搜索路径
指定需要搜索的⽬录, make 会⾃动找到指定⽂件的⽬录并添加到⽂件上。

VPATH = path1:path2:...
4.递归make
对于规模⽐较⼤的程序,需要多个⼈在多个⽬录下进⾏开发。

如果只⽤⼀个 Makefile 来维护就会⽐较⿇烦,因此可以在每个⽬录下建⽴⾃⼰的 Makefile ,然后在总控 Makefile 中调⽤⼦⽬录的 Makefile ⽂件。

⽬录结构如下:
.
├── add
│├── add_float.c
│├── add.h
│├── add_int.c
│└── Makefile
├── main.c
├── Makefile
└── sub
├── Makefile
├── sub_float.c
├── sub.h
└── sub_int.c
1.递归调⽤的⽅式
add:
cd add && $(MAKE)
它等价于
add:
$(MAKE) -C add
2.总控Makefile
CC = gcc
CFLAGS = -O2
TARGET = cacu
export OBJSDIR = $(shell pwd)/objs
$(TARGET):$(OBJSDIR) main.o
$(MAKE) -C add
$(MAKE) -C sub
$(CC) -o $(TARGET) $(OBJSDIR)/*.o
$(OBJSDIR):
mkdir -p $@
main.o:%.o:%.c
$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS) -Iadd -Isub
clean:
-$(RM) $(TARGET)
-$(RM) $(OBJSDIR)/*.o
如果总控 Makefile 中的⼀些变量需要传递给下层的 Makefile,可以使⽤ export 命令。

如:
export OBJSDIR = ./objs
3.⼦⽬录Makefile的编写
Add ⽬录下的 Makefile 如下:
OBJS = add_int.o add_float.o
all:$(OBJS)
$(OBJS):%.o:%.c
$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS)
clean:
$(RM) $(OBJS)
Sub ⽬录下的 Makefile 如下:
OBJS = sub_int.o sub_float.o
all:$(OBJS)
$(OBJS):%.o:%.c
$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS)
clean:
$(RM) $(OBJS)
Makefile 中的函数
1.获取匹配模式的⽂件名wildcard
这个函数的功能是查找当前⽬录下所有符合模式 PATTERN 的⽂件名,其返回值是以空格分割的、当前⽬录下的所有符合模式 PATTERN 的⽂件名列表。

其原型如下:
$(wildcard PATTERN)
例如,如下模式返回当前⽬录下所有扩展名位 .c 的⽂件列表。

$(wildcard *.c)
2.模式替换函数patsubst
这个函数的功能是查找字符串 text 中按照空格分开的单词,将符合模式 pattern 的字符串替换成 replacement。

Pattern 中的模式可以使⽤通配符, % 代表 0 个到 n 个字符,当 pattern 和 replacement 中都有 % 时,符合条件的字符将被 replacement 中的替换。

函数的返回值是替换后的新字符串。

其原型如下:
$(patsubst pattern, replacement, text)
例如,需要将 C ⽂件替换为 .o 的⽬标⽂件可以使⽤如下模式:
$(patsubst %.c, %.o, add.c)
上⾯的模式将 add.c 字符串作为输⼊,当扩展名为 .c 时符合模式 %.c ,其中 % 在这⾥代表 add,替换为 add.o,并作为输出字符串。

$(patsubst %.c, %.o, $(wildcard *.c))
输出的字符串将当前扩展名为 .c 的⽂件替换成 .o 的⽂件列表。

3.循环函数foreach
这个函数的原型为:
$(foreach VAR, LIST, TEXT)
函数的功能为 foreach 将 LIST 字符串中⼀个空格分割的单词,先传给临时变量 VAR ,然后执⾏ TEXT 表达式, TEXT 表达式处理结束后输出。

其返回值是空格分割表达式 TEXT 的计算结果。

例如,对于存在 add 和 sub 的两个⽬录,设置 DIRS 为 "add sub ./" 包含⽬录 add、sub 和当前⽬录。

表达式 $(wildcard $(dir)/*.c) ,可以取出⽬录 add 和 sub 及当前⽬录中的所有扩展名为 .c 的C语⾔源⽂件:
DIRS = sub add ./
FILES = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))
利⽤上⾯⼏个函数对原有的 Makefile ⽂件进⾏重新编写,使新的 Makefile 可以⾃动更新各个⽬录下的C语⾔源⽂件:
CC = gcc
CFLAGS = -O2 -Iadd -Isub
TARGET = cacu
DIRS = sub add .
FILES = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))
OBJS = $(patsubst %.c, %.o, $(FILES))
$(TARGET):$(OBJS)
$(CC) -o $(TARGET) $(OBJS)
clean:
-$(RM) $(TARGET)
-$(RM) $(OBJS)
以上内容来源于:
感谢分享!
1 #该⽂件⽤于当前⽬录下的c⽂件均为⼀个单独的程序
2 #后续可修改把⽬标⽂件通过参数指定
3 cc = gcc
4 #all:$(subst .c,.o,$(wildcard *.c))
5 PROGS = client server
6 all: $(PROGS)
7
8 #%o:%.c
9 # gcc -o $@ $<
10 %: %.c
11 $(cc) $(CFLAGS) $@.c -o $@ $(LDFLAGS) $(LDLIBS)
12
13 clean:
14 rm -f $(PROGS) $(TEMPFILES) *.o
以上的内容基本可以阅读⼤部分makefile了。

更多关于makefiel函数的内容,下⾯的博⽂写的更全⾯。

相关文档
最新文档