You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编辑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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:26:18