1.基本规则
目标:依赖 目标:要生成的目标文件
(tab)命令 依赖:目标文件由那些文件生成
命令:通过执行该命令由依赖文件生成目标
举例 :
add.o:add.c
gcc -c add.c -o add.c
(1)其他规则
- 目标的时间必须晚于依赖条件的时间,否则更新目标
- 依赖条件如果不存在 , 则去找新的规则产生依赖
- ALL:指定makefile的终极目标 , 否则make命令只会执行第一个目标
(2)当某一个cpp文件被修改,编译器如何知道
目标文件是通过依赖文件生成的 , 所以目标文件生成时间晚于依赖文件 ; 所以make的时候依次将目标文件和依赖文件时间进行对比 , 如果依赖文件的修改时间 > 目标文件说明依赖文件被修改了, 就需要重新生成目标文件
(3)补充
- 推荐先编译成 .o文件,最后再进行链接 : 当某一个文件改变,我们只需要重新生成那一个 .o目标文件 , 再链接起来 ,剩下的文件就不需要重新编译 , 提高效率.
- 如果某个目标的依赖文件被修改了, make会重新生成该目标,执行对应命令 ;否则该目标不会被重新生成
(4)make原理
- make会在当前目录下找名字为“Makefile”或“makefile”的文件。
- 如果找到,它会找文件当中的第一个目标文件,在上面的例子中,它会找到mytest这个文件,并把这个文件作为最终的目标文件。
- 如果mytest文件不存在,或是mytest所依赖的后面的test.o文件和main.o文件的文件修改时间比mytest文件新,那么它就会执行后面的依赖方法来生成mytest文件。
- 如果mytest所依赖的test.o文件不存在,那么make会在Makefile文件中寻找目标为test.o文件的依赖关系,如果找到则再根据其依赖方法生成test.o文件(类似于堆栈的过程)。
- 当然,你的test.c文件和main.c文件是存在的,于是make会生成test.o文件和main.o文件,然后再用test.o文件和main.o文件生成最终的mytest文件。
- make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
- 在寻找的过程中,如果出现错误,例如最后被依赖的文件找不到,那么make就会直接退出,并报错。
2.Makefile函数
(1) src = $(wildcard *.c)
- 将当前目录下所有的后缀为 .c的文件赋值给src , 将文件名组成列表, 赋值给src
- 相当于取出某一后缀的所有文件
(2) obj = $(patsubst %.cpp, %.o, $(src))
- %是通配符, 匹配字符串
- 把src变量里所有后缀为 .cpp 的文件替换成 .o
- 将参数3中包含参数1的部分,替换为参数2
3.补充
(1)三个自动变量
- $@ : 在规则的命令中,表示规则中的目标。
- $^ : 在规则的命令中,表示所有依赖条件
- $< : 在规则的命令中,表示第一一个依赖条件。 如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则
(2)伪目标
- 伪目标可以没有依赖
- .PHONY后面接伪目标,clean就是伪目标,伪目标:依赖方法总是被执行
(3)参数
① -n : 模拟执行make命令, 实际不执行,只是展示命令
②-f : 指定文件执行make 命令
4.实例