编辑Makefile后为何突然需要添加.o规则?
分析与修复Makefile中缺少.o规则的问题
看起来你的Makefile出了两个关键问题,导致编译时提示缺少.o文件的生成规则,咱们一步步来解决:
1. 缺少显式的目标文件编译规则
虽然GNU Make自带默认的.cc转.o的规则,但有时候自定义变量(比如你指定了CXX = g++-7)或者路径结构会导致默认规则不被正确触发。最稳妥的方式是显式添加这个规则,确保Make明确知道如何编译目标文件:
在你的Makefile中添加以下规则:
%.o: %.$(EXTENSION) $(CXX) $(CXXFLAGS) -c $< -o $@
这个规则的意思是:所有.o文件依赖对应的.cc文件(因为EXTENSION=cc),用指定的g++-7编译器,带上你定义的CXXFLAGS参数,只编译不链接,生成对应的目标文件。
2. Clean规则存在语法错误
你的clean规则写法完全不符合Makefile的语法规范:
clean: find . -name '*.o' -or -name '*.d' -or -name '*~'...
这里的问题有两个:
- 命令必须用tab键缩进,不能直接跟在目标冒号后面(Make会把这些字符串当成clean的依赖项,这显然不是你想要的)
- 命令末尾的
...是无效字符,而且缺少实际删除文件的动作(find输出需要传给rm来执行)
修复后的clean规则应该是:
.PHONY: clean clean: find . -name '*.o' -o -name '*.d' -o -name '*~' | xargs rm -f
完整修复后的Makefile
把这些修改整合后,你的Makefile应该是这样的:
CXX = g++-7 CC = gcc-7 CXXFLAGS = -Wall -Wimplicit-fallthrough -Wextra -g -fstack-protector-all -std=c++11 LDFLAGS = EXECUTABLE = engine EXTENSION = cc SOURCES = $(basename $(shell find . -name '*.$(EXTENSION)')) .PHONY: all all: $(EXECUTABLE) # 显式添加.o文件编译规则 %.o: %.$(EXTENSION) $(CXX) $(CXXFLAGS) -c $< -o $@ $(EXECUTABLE): $(addsuffix .o, $(SOURCES)) $(CXX) $(LDFLAGS) $^ -o $@ %.d: %.$(EXTENSION) $(CXX) $(CXXFLAGS) -MM $< -o $@ -include $(addsuffix .d, $(SOURCES)) .PHONY: clean clean: find . -name '*.o' -o -name '*.d' -o -name '*~' | xargs rm -f
额外检查点
你可以先运行make clean清理旧的目标文件和依赖文件,然后再运行make重新编译,应该就能解决缺少.o规则的问题了。如果还是有问题,可以检查SOURCES变量的输出是否正确——运行make -n查看Make解析后的源文件列表,确保所有需要编译的.cc文件都被正确识别。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

