Makefile模式规则依赖链无法触发构建,添加空目标可修复的原因
Makefile模式规则无法触发隐式构建链的原因
先看现有Makefile内容:
run-%: % ./$<
当前目录下存在test1.cpp文件,执行make run-test1时,原本期望Make通过隐式规则先编译test1.cpp生成test1.o,再链接成可执行文件test1,最后执行run-test1规则运行程序,但实际报错:
make: *** No rule to make target 'run-test1'. Stop.
添加空目标test1:后问题即可解决,原因如下:
- Make处理模式规则(比如这里的
run-%: %)时,会先检查规则的依赖目标(也就是test1)是否有合法的生成途径。默认的C++编译隐式规则(从.cpp到.o再到可执行文件)属于隐含模式规则,这类规则不会被模式规则的依赖匹配过程主动触发——Make会先判定test1是否是一个存在的文件,或者是否有明确的目标规则定义,只有确认这一点后,才会去查找对应的隐式构建规则。 - 当没有定义
test1:这个空目标时,Make会认为test1既不存在,也没有任何明确的目标规则,直接判定无法生成run-test1的依赖,因此报错。 - 添加空目标
test1:后,相当于明确告诉Make:test1是一个需要构建的目标。此时Make会自动去查找匹配这个目标的隐式规则,发现存在test1.cpp后,就会触发默认的编译链接规则,生成test1可执行文件,进而正常执行run-test1规则。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

