Makefile替换静态模式为%.o: %.c后报错No rule to make target是什么原因?
问题原因分析
你遇到的报错核心来自静态模式规则和通用模式规则的行为差异,以及空规则对内置隐式规则的覆盖特性,具体原因如下:
- 静态模式规则
$(objects): %.o: %.c是显式绑定到$(objects)指定的目标列表的规则:
它仅作用于列表内的foo.o、bar.o、all.o三个目标,作用是声明这三个目标的依赖为同名.c文件。即使你没有显式写编译命令,make也会自动调用内置的C编译隐式规则完成.o文件的生成,不会影响全局的规则逻辑。 - 通用模式规则
%.o: %.c是全局泛匹配规则,且你没有为它指定执行命令:
当你声明了一个没有命令的通用模式规则时,make会认为你要覆盖内置的同名隐式规则,原本内置的%.o: %.c对应的编译命令($(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@)会被清空。此时make只知道.o文件依赖.c文件,但不知道怎么从.c生成.o,自然会报找不到生成规则的错误。
另外你测试时用的-r参数本身就是禁用所有内置隐式规则,这种情况下哪怕没有规则覆盖,也不会有默认的编译命令可用,必然报错。
修复方案
如果你想改用通用模式规则,只要给规则补充对应的编译命令即可正常运行:
%.o: %.c $(CC) $(CFLAGS) -c $< -o $@
如果不需要自定义编译逻辑,也可以直接删掉这条空的通用模式规则,直接用make内置的隐式规则就能完成编译。
内容的提问来源于stack exchange,提问作者Mohamed Atef
相关产品推荐
相关产品推荐

