外观
06.make的隐式规则
约 1210 字大约 4 分钟
个人随笔隐式规则记录
2022-06-18
第十五部分 :make的隐式规则(上)
15.1 问题:如果同一个目标的命令拆分的写到不同地方,会发生什么?
15.2 下面的程序怎么执行?为什么?
.PHONY : all
all :
@echo "command-1"
VAR := test
all :
@echo "all : $(VAR)"15.3 makefile 中出现同名目标时
依赖︰
- 所有的依赖将合并在一起,成为目标的最终依赖
命令∶
- 当多处出现同一目标的命令时,make发出警告
- 所有之前定义的命令被最后定义的命令取代
15.4 注意事项
当使用include关键字包含其它文件时,需要确保被包含文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖!
15.5 编程实验:命令的拆分
.PHONY : all
VAR := test
all :
@echo "all : $(VAR)"
include 1.mk
15.6 什么是隐式规则( built-in rules ) ?
- make提供了一些常用的,例行的规则实现
- 当相应目标的规则未提供时,make尝试使用隐式规则
15.7 下面的makefile能成功编译吗?为什么?
SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.o)
CC := gcc
all :
@echo "$(.VARIABLES)"
app.out : $(OBJS)
$(CC) -o $@ $^
$(RM) $^
@echo "Target ==> $@"
以下为去掉部分
%.o : %.c
@echo "my rule"
$(CC) -c -o $@ $^若去掉一部分会编译成功吗?会的

15.8 初探隐式规则
- make提供了生成目标文件的隐式规则
- 隐式规则会使用预定义变量完成编译工作
- 改变预定义变量将部分改变隐式规则的行为
- 当存在自定义规则时,不再使用隐式规则
15.9 小结
- 当多处出现同一目标的命令时,只有最后定义的命令有效
- make提供了一系列的隐式规则可使用
- 当makefile 中未定义相关规则时,尝试使用隐式规则
- 隐式规则中可能使用make 中的预定义变量
- 改变预定义变量可部分改变预定义规则的行为
第十六部分 :make 的隐式规则(下)
16.1 深入理解隐式规则
- 当make 发现目标的依赖不存在时
- 尝试通过依赖名逐一查找隐式规则
- 并且通过依赖名推导可能需要的源文件

16.2 隐式规则的副作用
编译行为难以控制
- 大量使用隐式规则可能产生意想不到的编译行为
编译效率低下
- make从隐式规则和自定义规则中选择最终使用的规则
16.3 隐式规则链
当依赖的目标不存在时,make 会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为!

16.4 问题:make提供了多少隐式规则?如何查看隐式规则?
- 查看隐式规则
- 查看所有:make -p
- 查看具体规则:make -p | grep "XXX”

16.5 编程实验:深入隐式规则
app.out : main.o func.o
$(CC) -lstdc++ -o $@ $^当文件夹里没有main.o和func.o,但是有func.p时,自动使用隐式规则,误用func.p编译成func.o。

16.5 隐式规则的禁用
局部禁用
- 在makefile 中自定义规则
- 在makefile 中定义模式(如:%.o : %.p )
全局禁用
- make -r
16.5 后缀规则简介
- 后缀规则是旧式的“模式规则”
- 可以通过后缀描述的方式自定义规则

双后缀规则
- 定义一对文件后缀(依赖文件后缀和目标文件后缀)
- 如: .cpp.o <--> %.o :%.cpp
- 定义一对文件后缀(依赖文件后缀和目标文件后缀)
单后缀规则
- 定义单个文件后缀(源文件后缀)
- 如:.c <--> %∶%.c
- 定义单个文件后缀(源文件后缀)
16.5 关于后缀规则的注意事项
- 后缀规则中不允许有依赖
- 后缀规则必须有命令,否则无意义
- 后缀规则将逐步被模式规则取代
16.6 编程实验:后缀规则初体验
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 $^16.7 小结
- 隐式规则可能造成意想不到的编译行为
- 在实际工程项目中尽量不使用隐式规则
- 后缀规则是一种旧式的模式规则
- 后缀规则正逐步被模式规则取代
