1. 目标拆分
mekefile 中出现同名目标时
- 依赖:所有的依赖将合并在一起,成为目标的最终依赖
- 命令:当多处出现同一目标的命令时,make发出警告,所有之前的命令将被最后定义的命令覆盖
EG:
all :
@echo "the one all"
all :
@echo "the two all"
all :
@echo "the three all"
执行结果:
2. 初探隐式规则
什么是隐式规则?
- make 提供了一些常用的,例行的规则实现
- 当相应的目标的规则未提供时,make尝试使用隐式规则
代码示例:( 思考下面的makefile文件是否可以执行 )
[main.c]
#include<stdio.h>
void func();
int main()
{
func();
return 0;
}
[func.c]
#include<stdio.h>
void main()
{
printf("func\n");
}
[makefile]
main.out : func.o main.o
gcc -o $@ $^
执行结果:
结果分析:
这里有很多疑问?cc 是什莫?生成.o文件对应的规则在哪里
- cc是make解释器中默认的预定义变量
- 生成.o 的规则也是make默认的隐式规则
隐式规则分析:
- make 提供了生成目标文件的隐式规则
- 隐式规则会使用预定义变量完成编译工作
- 改变预定义变量将部分改变隐式规则的行为
- 自定义规则优先级别更高,当存在自定义规则时,不在使用隐式规则
3. 总结
- 当多处出现同一目标的命令时,只有最后定义的命令有效
- make 提供了一些列的隐式规则可使用
- 当 makefile 中未定义相关规则时,尝试使用隐式规则
- 隐式规则中可能使用 make 中的预定义变量
- 改变预定义变量可部分改变预定义规则的行为