GNU Make默认编译同名C文件的原因及禁用方法咨询
问题解答
自动执行cc命令的原因
这是GNU Make的隐式规则导致的。make内置了一系列预设规则,用来自动推导目标文件的生成方式。当make发现需要生成abc.o,且当前目录存在对应的abc.c源文件时,就会触发内置的C文件编译规则,自动执行cc -c -o abc.o abc.c来生成目标文件。
禁用隐式规则的方法
有两种常用方式:
- 全局禁用所有隐式规则:在Makefile开头添加
MAKEFLAGS += -r,这样make会忽略所有内置的隐式规则。 - 针对特定目标禁用:如果只需要针对
abc.o禁用自动生成,可以给abc.o定义一个报错规则:
abc.o: @echo "Error: abc.o does not exist!" && exit 1
实现检查abc.o存在性的需求
修改Makefile,去掉对abc.o的依赖声明,改为显式检查文件是否存在:
test: @if [ ! -f abc.o ]; then echo "Error: abc.o does not exist!" && exit 1; fi @echo 'execute test.' clean: $(RM) test abc.o .PHONY: test clean
这样当abc.o不存在时,make会直接输出错误信息并退出,不会尝试自动编译生成。
内容的提问来源于stack exchange,提问作者user5933728
相关产品推荐
相关产品推荐

