1. 深入理解隐式规则
当make发现目标的依赖不存在时:
1) 尝试通过依赖名逐一查找隐式规则
2) 并且通过依赖名推导可能需要的源文件
2. 隐式规则的副作用
-
编译行为难以控制:大量使用隐式规则可能产生意想不到的编译行为
-
编译效率低下:make从隐式规则和自定义规则中选择最终使用的规则,编译效率低
3.隐式规则链
当依赖的目标不存在时,make会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为。
4. 查看隐式规则
查看所有:
make -p
查看具体规则:
make - p | grep xxx
make -p | grep "%.o"
编程实验:深入隐式规则 makefile.1
func.p
unit Func; interface procedure Greeting(); attribute (name = 'greeting'); implementation procedure Greeting(); begin WriteLn('Hello, Pascal!'); end; end.
main.c
#include <stdio.h> extern void greeting(); int main() { greeting(); return 0; }
makefile.1
app.out : main.o func.o $(CC) -lstdc++ -o $@ $^
运行结果:
增加func.c:
func.c
#include "stdio.h" void greeting() { printf("greeting "); }
运行结果:
5. 隐式规则的禁用
-
局部禁用:
1)在makefile中自定义规则
2)在makefile中定义模式(如:
%.o : %.p
) -
全局禁用:
make -r
6. 后缀规则简介
-
后缀规则时旧式的模式规则
-
可以通过后缀描述的方式自定义规则
- 双后缀规则:定义一对文件后缀(依赖文件后缀和目标文件后缀)
- 单后缀规则:定义单个文件后缀(源文件后缀)
7.后缀规则的注意事项
-
后缀规则中不允许有依赖
-
后缀规则必须有命令,否则无意义
-
后缀规则将逐步被模式规则取代
编程实验:后缀规则初体验 makefile.2
app.out : main func.o $(CC) -lstdc++ -o $@ $^ .c.o : @echo "my suffix rule" $(CC) -o $@ -c $^ .c : @echo "my suffix rule" $(CC) -o $@ -c $^
运行结果:
8.小结
-
隐式规则可能造成意想不到的编译行为
-
在实际工程项目中尽量不使用隐式规则
-
后缀规则是一种旧式的模式规则
-
后缀规则正逐步被模式规则取代