1.makefile中出现同名目标时
依赖:
所有的依赖将合并在一起,成为目标的最终依赖
命令:
当多处出现同一目标命令时,make发出警告
所有之前定义的命令被最后定义的命令取代
注意事项:
当使用include关键字包含其他文件时,需要确保被包含的文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖
2.什么是隐式规则
mkae提供了一些常用的,例行的规则实现
当相应目标的规则未提供时,make尝试使用隐式规则
make所有预定义变量有哪些:$(.VARIABLES)
初探隐式规则:
make提供了生成目标文件的隐式规则
隐式规则会使用预定义变量完成编译工作
改变预定义变量将部分改变隐式规则的行为
当存在自定义规则时,不再使用隐式规则
3.深入理解隐式规则
当make发现目标的依赖不存在时:
尝试通过依赖名逐一查找隐式规则
并且通过依赖名推导可能需要的源文件
隐式规则的副作用:
编译行为难以控制
编译效率低下
隐式规则链:
当依赖的目标不存在时,make会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为!
例:需要名为N.o的目标:N.y -> N.c -> N.o
查看隐式规则:
查看所有:make -p
查看具体规则:make -p | grep “XXX”
隐式规则的禁用:
局部禁用:
在makefile中自定义规则
在makefile中定义模式(如:%.o:%.p)
全局禁用:
make -r
后缀规则简介:
后缀规则是旧时的“模式规则”
可以通过后缀描述的方式自定义规则
双后缀规则:
定义一对文件后缀(依赖文件后缀和目标文件后缀)
如: .cpp.o == %.o:%.cpp
单后缀规则;
定义单个文件后缀(源文件后缀)
如:.c == %:%.c
关于后缀规则的注意事项:
后缀规则中不允许有依赖
后缀规则必须有命令,否则无意义
后缀规则将逐步被模式规则取代