Makefile链接报错:undefined reference to `main'问题求助
解决Makefile链接时
undefined reference to main的问题 你遇到的这个链接错误,核心原因是Makefile里的链接命令没有包含生成的目标文件,导致编译器找不到main函数所在的main.o文件(以及其他依赖的.o文件)。
先看你原Makefile里的链接规则:
$(BIN): $(OBJ) $(CXX) $(LDFLAGS)
这一行只执行了g++加上链接参数,但完全没告诉编译器要把哪些.o文件链接起来——相当于你让编译器生成二进制,却不给它任何原材料,它当然找不到main函数了。而且这里还缺了指定输出文件的-o $(BIN)参数,默认会生成a.out而不是你想要的run。
修正后的完整Makefile
CXX = g++ CXXFLAGS = -g -Wall -std=c++14 LDFLAGS = -lboost_system -lcrypto -lssl -lcpprest -lpthread SRC := $(shell find . -name *.cpp) OBJ = $(SRC:%.cpp=%.o) BIN = run all: $(BIN) $(BIN): $(OBJ) $(CXX) $(OBJ) -o $(BIN) $(LDFLAGS) # 关键修改:添加$(OBJ)和-o $(BIN),调整LDFLAGS位置 %.o: %.cpp $(CXX) -c $(CXXFLAGS) $< -o $@ clean: find . -name *.o -delete rm -f $(BIN)
关键修改点说明
- 添加
$(OBJ):把所有扫描到的.cpp生成的.o文件都传入链接命令,这样编译器就能找到包含main函数的main.o了。 - 添加
-o $(BIN):明确指定输出的二进制文件名是你定义的run,避免默认生成a.out。 - 调整
LDFLAGS到末尾:链接器对参数顺序有要求,依赖库要放在目标文件之后,这样能避免一些潜在的链接错误(比如某些库的符号找不到)。
这样修改后,重新执行make,应该就能正常编译链接出run二进制文件了。
内容的提问来源于stack exchange,提问作者CorellianAle




