---- 整理自狄泰软件唐佐林老师课程
文章目录
- [1. 隐式规则:同名目标时](#1. 隐式规则:同名目标时)
- [2. 什么是隐式规则](#2. 什么是隐式规则)
- [3. 深入理解隐式规则](#3. 深入理解隐式规则)
- [4. 查看隐式规则](#4. 查看隐式规则)
- [5. 后缀规则](#5. 后缀规则)
1. 隐式规则:同名目标时
- 问题:如果同一个目标的命令拆分的写到不同地方,会发生什么?
- makefile 中出现同名目标时:
- 依赖:所有的依赖将合并到一起,成为目标的最终依赖
- 命令:当多处出现同一目标的命令时,make 发出警告;所有之前定义的命令被最后定义的命令取代
- 注意事项:
当使用 include 关键字包含其它文件时,需要确保被包含文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖
2. 什么是隐式规则
- make 提供了生成目标文件的隐式规则(一些常用的,例行的规则实现)
- 当相应目标的规则未提供时,make 尝试使用隐式规则
- 隐式规则会使用预定义变量完成编译工作
- 改变预定义变量将部分改变隐式规则的行为
- 当存在自定义规则时,不再使用隐式规则
3. 深入理解隐式规则
- 当 make 发现目标的依赖不存在时:
尝试通过依赖名逐一查找隐式规则
并且通过依赖名推导可能需要的源文件
-
隐式规则的副作用:
编译行为难以控制:大量使用隐式规则可能产生意想不到的编译行为
编译效率低下:make 从隐式规则和自定义规则中选择最终使用的规则
-
隐式规则链
当依赖的目标不存在时,make 会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为
例如:需要名为 N.o 的目标:
4. 查看隐式规则
- 查看所有:
make -p
- 查看具体规则:
make -p | grep "xxx"
- 隐式规则的禁用
局部禁用:在 makefile 中自定义规则;在 makefile 中定义模式(如:%.o:%.p
)
全局禁用:make -r
5. 后缀规则
- 后缀规则是旧式的"模式规则"
- 可以通过后缀描述的方式自定义规则
- 双后缀规则:定义一对文件后缀(依赖文件后缀和目标文件后缀)
如:.cpp.o <==> %.o:%.cpp
- 单后缀规则:定义单个文件后缀(源文件后缀)
如:.c <==> %:%.c
- 关于后缀规则的注意事项
后缀规则中不允许有依赖
后缀规则中必须有命令,否则无意义
后缀规则将逐步被模式规则取代