一、makefile自动化变量
- $@ 规则中目标文件的集合。
- < 依 赖 目 标 中 的 第 一 个 目 标 名 字 。 如 果 依 赖 目 标 是 以 模 式 ( 即 " < 依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么" <依赖目标中的第一个目标名字。如果依赖目标是以模式(即"<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
- $^ 所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
示例:
test1.o test2.o test3.o:test1.c test2.c test3.c
gcc -o $@ $^
$@=test1.o test2.o test3.o
$^=test1.c test2.c test3.c
二、Makefile中的运算符
- = 最基本的赋值
- := 覆盖之前的值,该赋值不会被递归展开
- ?= 如果没有被赋值过就赋予等号后面的值,如果之前赋值过则使用之前的值,本次赋值无效。
- += 是添加等号后面的值
详细的说明可以参考https://www.cnblogs.com/wanghuaijun/p/8092747.html
三、makefile如何指定头文件路径
- makefile通常用“-I” 指定头文件的路径。
示例:
INCLUDES = -I./inc
$(CC) -c $(INCLUDES) $(SRC)
INCLUDES也可以用其它变量代替。
通常头文件路径只需要在编译过程中使用。
四、伪目标 .PHONY
所谓伪目标就是这样一个目标,它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们将一个伪目标成为标签。
基本格式:
.PHONY:clean
clean:
rm *.o *.s
伪目标的作用
- 【1】 解决相同目录下存在同名文件产生冲突的问题。
如果我们在一个Makefile中定义了一个名为clean伪目标,假设当前目录下存在一个同名的文件clean,那么在执行make clean的时候就会产生冲突。
- 【2】伪目标的另一种使用场合时在make的并行和递归执行过程中。这条在实际使用中还没遇到过,这里不多做解释,有兴趣的可以百度一下。