Make执行报错:无`Arguments.o`目标生成规则,请求排查解决
这个错误我之前也碰到过,核心问题是你的Makefile里目标文件的路径和规则不匹配,导致Make找不到生成Arguments.o的正确方式。我帮你一步步梳理和修改:
问题根源拆解
你定义的OBJECTS变量是去掉SOURCE_PATH前缀的.o文件名(比如Arguments.o),但你的编译规则是把.o文件输出到TEMP_PATH目录下,同时模式规则%.o: %.cpp是告诉Make「当前目录下的.cpp生成当前目录下的.o」——但你的源文件在SOURCE_PATH里,生成的.o又在TEMP_PATH里,完全对不上,所以Make就报错说找不到生成目标的规则。
具体修改步骤
修正OBJECTS变量,带上临时目录前缀
让Make知道要找的.o文件在TEMP_PATH里,而不是当前目录:OBJECTS=$(addprefix $(TEMP_PATH),$(SOURCES:.cpp=.o))调整模式规则,明确源文件和目标文件的路径
修改规则,让它匹配SOURCE_PATH下的.cpp文件,生成到TEMP_PATH下的.o:$(TEMP_PATH)%.o: $(SOURCE_PATH)%.cpp $(CC) -c -std=$(STD) -I$(INCLUDE_PATH) -L$(LIBRARY_PATH) -o $@ $<修正链接命令,用编译好的.o文件而非源文件
原来的链接命令直接用$(SOURCES),相当于跳过编译步骤直接编译源文件,这完全违背了Makefile的初衷,改成用生成的.o文件:all: $(OBJECTS) $(CC) $(OBJECTS) -o $(OUTPUT_PATH)$(OUTPUT_NAME)
额外的优化建议
- 建议明确指定C++编译器,默认的
$(CC)是C编译器,改成CC=g++更合适; - 加上
mkdir -p $(TEMP_PATH)的命令,确保临时目录存在,避免编译时因为目录不存在失败; - 可以加个
clean目标方便清理生成文件。
修改后的完整Makefile示例(假设你已经定义好路径变量):
# 假设这些路径已提前定义 SOURCE_PATH := ./source INCLUDE_PATH := ./include LIBRARY_PATH := ./lib TEMP_PATH := ./temp/ OUTPUT_PATH := ./bin/ SOURCES=$(subst $(SOURCE_PATH)/,,$(shell find $(SOURCE_PATH) -name "*.cpp")) OBJECTS=$(addprefix $(TEMP_PATH),$(SOURCES:.cpp=.o)) OUTPUT_NAME=slang STD=c++14 CC=g++ all: $(OBJECTS) $(CC) $(OBJECTS) -o $(OUTPUT_PATH)$(OUTPUT_NAME) $(TEMP_PATH)%.o: $(SOURCE_PATH)%.cpp @mkdir -p $(TEMP_PATH) $(CC) -c -std=$(STD) -I$(INCLUDE_PATH) -L$(LIBRARY_PATH) -o $@ $< clean: rm -rf $(TEMP_PATH) $(OUTPUT_PATH)$(OUTPUT_NAME)
这样修改后,再运行make应该就能正常编译了。
内容的提问来源于stack exchange,提问作者Weline
相关产品推荐
相关产品推荐

