<目标> : <依赖文件集合>
命令 1
命令 2
示例:
# -c : 编译生成同名目标文件(xx.o),不链接
# -o : 链接生成可执行文件(target)
target : main.o hello.o world.o
gcc -o target main.o hello.o world.o
main.o: main.c
gcc -c main.c
hello.o: hello.c
gcc -c hello.c
world.o: world.c
gcc -c world.c
clean:
rm *.o
rm abc
Makefile中的变量都是字符串,类似 C语言中的宏。
变量相关符号:
| 符号 | 功能 | 描述 |
|---|---|---|
= | 赋值符 | 变量的真实值取决于它所引用的变量的最后一次有效值。 |
:= | 赋值符 | 不会使用后面定义的变量,只能使用前面已经定义好的。 |
?= | 赋值符 | 如果前面已经赋过值了,就使用前面赋的值;如果变量没有被赋值就使用当前定义的值。 |
+= | 变量追加 | 给之前已经定义好的变量添加一些变量。 |
示例:
OBJ = main.o
OBJ += hello.o
OBJ += world.o
或者
OBJ = main.o hello.o world.o
target : $(OBJ)
gcc -o target $(OBJ)
main.o: main.c
gcc -c main.c
hello.o: hello.c
gcc -c hello.c
world.o: world.c
gcc -c world.c
clean:
rm *.o
rm abc
% :表示长度任意的非空字符串。类似于通配符。
# `%.o`:所有的以 `.o` 结尾的文件
# `%.c`:所有的以 `.c` 结尾的文件
# 当“ “%”出现在目标中的时候,目标中 “%”所代表的值决定了依赖中的 “%”值
%.o: %.c
<命令>
| 自动化变量 | 描述 |
|---|---|
$@ | 规则中的目标集合,在模式规则中,如果有多个目标的话,“,“$@”表示匹配模式中定义的目标集合。 |
$% | 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。 |
$< | 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“ “%””)定义的,那么““$<”就是符合模式的一系列的文件集合。 |
$? | 所有比目标新的依赖目标集合,以空格分开。 |
$^ | 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,““$^”会去除重复的依赖文件,只保留一份。 |
$+ | 和““$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。 |
$* | 这个变量表示目标模式中"%"及其之前的部分,如果目标 是 test/a.test.c,目标模式为 a.%.c,那么 “$*”就是 test/a.test。 |
示例:
OBJ = main.o hello.o world.o
target : $(OBJ)
gcc -o target $(OBJ)
# %.o 代表 main.o hello.o world.o
# %.c 代表 main.c hello.c world.c
# $< : 符合模式的一系列的依赖文件集合。即 `%.c` 代表的 main.c hello.c world.c
%.o: %.c
gcc -c $<
clean:
rm *.o
rm abc
Makefile同级目录有clean文件,当执行make clean时,规则因为没有依赖文件,所以目标被认为是最新的,因此后面的命令也就不会执行。.PHONY : clean 之后,make clean 后面的命令就都会执行了。示例:
.PHONY : clean
clean:
rm *.o
rm abc
ifeq (<参数 1>, <参数 2>)
ifeq ‘<参数1>’ “<参数2>” # 参数使用单引号、双引号都是可以的
<语句>
else
<语句>
endif
ifdef <变量名 >
<语句>
else
<语句>
endif
| 函数 | 功能 | 格式 | 示例 |
|---|---|---|---|
subst | 字符串替换 | $(subst | $(subst zzk,ZZK,my name is zzk) |
patsubst | 模式字符串替换 | $(patsubst | $(patsubst %.c,%.o,a.c b.c c.c) |
dir | 提取出目录部分 | $(dir | $(dir ) |
notdir | 提取出文件名部分 | $(notdir | $(notdir ) |
foreach | 循环 | $(foreach , | |
wildcard | 定义变量时的规则 | $(wildcard PATTERN……) | $(wildcard *.c) |
patsubst:此函数查找字符串 中的单词是否符合模式 ,如果匹配就用 来替换掉, 可以使用通配符“ “%”,表示任意长度的字符串,函数返回值就是替换后的字符串。如果 中也包涵“ “%”,那么 中的“ “%”将是 中的那个““%”所代表的字符串。foreach:此函数的意思就是把参数
中的单词逐一取出来放到参数 中,然后再执行 所包含的表达式。每次 都会返回一个字符串,循环的过程中, 中所包含的每个字符串会以空格隔开,最后当整个循环结束时, 所返回的每个字符串所组成的整个字符串将会是函数 foreach 函数的返回值。# 函数调用方式
$(函数名 参数集合 )
${函数名 参数集合 }
示例:
# 搜索当前目录下所有的 .c 后缀的源文件
SRC = $(wildcard *.c)
# 把 $(SRC) 里面所有的 .c 文件替换成 .o 文件
OBJ = $(patsubst %.c, %.o, $(SRC))