Makefile编译多C++文件时特定文件名下编译失败问题求助
问题根因
你编写的Makefile中链接目标二进制的规则使用了自动变量$<,该变量的含义是仅取依赖列表中的第一个文件,因此链接阶段只会传入第一个.o文件:
- 当含main的文件名排序靠前时,第一个
.o带main函数,编译链接正常 - 当类文件的文件名排序靠前时,第一个
.o没有main函数,就会报undefined reference to 'main'的链接错误
修复方案
将$(BIN)目标规则中的$<替换为$^,$^的含义是取所有依赖文件的完整列表,所有.o文件都会参与链接,不会受文件名排序影响。
修改后的对应规则如下:
$(BIN): $(OBJS) $(CC) $(CFLAGS) $^ -o $@
Makefile优化建议
给你几个适合入门阶段的优化调整点,更符合Makefile编写规范:
- 变量命名调整:C项目约定俗成使用
CXX指代C编译器,CXXFLAGS指代C++编译参数,CC默认是C语言编译器的变量名,调整后可读性更强:
# 替换原来的CC和CFLAGS定义 CXX=g++ CXXFLAGS=-g -Wall
- 增加伪目标声明:在Makefile中添加
.PHONY: all clean声明,避免当前目录下出现名为all、clean的文件时,make误判目标已最新不执行对应命令。 - 自动创建目录:如果
obj、bin目录不存在时直接执行make会报错,可以在规则中添加目录创建逻辑,避免手动新建目录的操作:
$(OBJ)/%.o: $(SRC)/%.cpp mkdir -p $(OBJ) $(BINDIR) $(CXX) $(CXXFLAGS) -c $< -o $@
- 后续项目规模扩大后,可以添加头文件依赖自动生成逻辑,避免修改头文件后make不重新编译关联源文件的问题,入门阶段可以先不用实现。
内容的提问来源于stack exchange,提问作者GiGGioSo
相关产品推荐
相关产品推荐

