通用Makefile编译C/C++项目未输出预期结果 报错问题求助
Makefile问题排查与修复方案
核心错误原因
- 模式规则依赖配置错误:原写法
$(OBJ_DIR)/%.o: $(SRC)将所有源文件列为每个.o目标的依赖,自动变量$<永远只会取第一个源文件,导致所有目标文件都基于同一个源文件编译,逻辑完全错误。同时错误的依赖关系触发了Make的隐式规则,调用本地默认的cc编译器尝试链接交叉编译生成的ARM架构目标文件,才会出现file in wrong format的格式报错。 - obj子目录未自动创建:src下存在多层子目录时,对应的obj下的嵌套目录不会自动生成,编译时会出现输出路径不存在的报错,原创建目录规则仅生成了obj、bin根目录,未处理嵌套路径。
- find命令参数存在Shell展开风险:未给通配符加引号,当前目录存在cpp/c文件时会提前展开,导致find结果不符合预期。
修复后的完整Makefile
SRC_DIR := src OBJ_DIR := obj BIN_DIR := bin # 交叉编译配置 CXX := arm-linux-gnueabi-g++ CC := arm-linux-gnueabi-gcc EXE := $(BIN_DIR)/runfile # 给通配符加引号避免shell提前展开 SRC := $(shell find $(SRC_DIR) -name "*.cpp" -or -name "*.c") OBJ := $(patsubst $(SRC_DIR)/%,$(OBJ_DIR)/%,$(addsuffix .o,$(basename $(SRC)))) CPPFLAGS := -Iinc -Iinc/common -MMD -MP CXXFLAGS := -std=c++11 -Wall CFLAGS := -Wall LDFLAGS := -Llib LDLIBS := .PHONY: all clean all: $(EXE) $(EXE): $(OBJ) | $(BIN_DIR) $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@ # 分开定义C++和C的编译规则 $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp | $(OBJ_DIR) # 先创建对应输出目录的嵌套路径 @mkdir -p $(dir $@) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR) @mkdir -p $(dir $@) $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ $(BIN_DIR) $(OBJ_DIR): mkdir -p $@ clean: @$(RM) -rv $(BIN_DIR) $(OBJ_DIR) # 引入自动生成的依赖文件 -include $(OBJ:.o=.d)
注意:Makefile中所有规则的命令行必须以Tab缩进,不能用空格替换,否则会触发语法错误。
验证方法
执行make clean && make即可正常完成交叉编译,生成ARM架构的可执行文件。
内容的提问来源于stack exchange,提问作者Engineer999
相关产品推荐
相关产品推荐

