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

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就报错说找不到生成目标的规则。

具体修改步骤

  1. 修正OBJECTS变量,带上临时目录前缀
    让Make知道要找的.o文件在TEMP_PATH里,而不是当前目录:

    OBJECTS=$(addprefix $(TEMP_PATH),$(SOURCES:.cpp=.o))
    
  2. 调整模式规则,明确源文件和目标文件的路径
    修改规则,让它匹配SOURCE_PATH下的.cpp文件,生成到TEMP_PATH下的.o:

    $(TEMP_PATH)%.o: $(SOURCE_PATH)%.cpp
        $(CC) -c -std=$(STD) -I$(INCLUDE_PATH) -L$(LIBRARY_PATH) -o $@ $<
    
  3. 修正链接命令,用编译好的.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:22