You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)

关键修改点说明

  1. 添加$(OBJ):把所有扫描到的.cpp生成的.o文件都传入链接命令,这样编译器就能找到包含main函数的main.o了。
  2. 添加-o $(BIN):明确指定输出的二进制文件名是你定义的run,避免默认生成a.out
  3. 调整LDFLAGS到末尾:链接器对参数顺序有要求,依赖库要放在目标文件之后,这样能避免一些潜在的链接错误(比如某些库的符号找不到)。

这样修改后,重新执行make,应该就能正常编译链接出run二进制文件了。

内容的提问来源于stack exchange,提问作者CorellianAle

火山引擎 最新活动