关于自动生成的*.d依赖文件无Recipe时规则行为的文档问询
GNU Make中空Recipe规则的官方说明
GNU Make官方文档明确说明:只包含目标和依赖列表、没有Recipe的规则,唯一作用就是给目标添加额外依赖,不会定义新的Recipe,也不会覆盖已有的Recipe。
你用g++ -MMD生成的.d文件里的规则(比如foo.o: foo.cpp include/bar.h)就属于这种空Recipe规则。通过-include引入这些文件后,Make会把这些额外依赖(比如头文件)关联到对应的.o目标上,但不会给这些目标提供新的构建逻辑。
由于你已经在Makefile里定义了%.o: %.cpp的模式规则(带有完整编译Recipe),当Make需要构建.o文件时,会直接用这个已有规则的Recipe执行编译。而那些空Recipe的依赖规则只负责一件事:只要.d文件里的任何依赖(比如头文件)发生变化,就触发Make重新用你定义的Recipe编译对应的.cpp文件。
这种行为和隐式规则无关,是GNU Make对空Recipe规则的基础定义——不管目标有没有匹配隐式规则,空Recipe规则都只做补充依赖的工作,不会改变Recipe的执行逻辑。
内容的提问来源于stack exchange,提问作者Hakim
相关产品推荐
相关产品推荐

