如何修复undefined reference to `main' collect2: ld returned 1 exit status报错
问题排查与修复方案
该undefined reference to main错误本质是链接器生成可执行文件时,未找到C/C++程序要求的全局入口函数main,可按以下步骤排查:
- 第一步:检查源码存放路径与后缀是否符合Makefile预期
Makefile中定义的待编译源文件匹配规则为host/src/*.cpp和../common/src/AOCLUtils/*.cpp,首先确认携带main函数的主机代码是否存放在host/src/目录下,且文件后缀为.cpp。可执行命令ls host/src/确认路径下的文件列表,排查是否存在文件放错目录、后缀误写为.c/.cc等问题。 - 第二步:检查main函数定义是否符合规范
全局作用域下的main函数必须为标准写法,以下两种为合法格式:
需排查是否存在以下错误:int main() // 或 int main(int argc, char* argv[])- 函数名拼写错误,比如写成Main、MAIN等
- main函数被包裹在自定义命名空间中,导致全局作用域无法识别
- 遗漏main函数的返回值声明,比如写为
void main()(该写法不符合GCC的C/C++标准要求)
- 第三步:验证Makefile是否正确识别到所有待编译文件
在Makefile的SRCS := $(wildcard host/src/*.cpp ../common/src/AOCLUtils/*.cpp)行后新增一行$(info 待编译文件列表: $(SRCS)),执行make后查看输出的文件列表,确认携带main函数的文件是否在列表内。
也可以直接执行make VERBOSE=1开启编译日志输出,查看实际执行的g++命令后携带的源文件是否完整,是否遗漏了你的业务代码文件。
常见修复方案
- 如果是路径不匹配:修改
SRCS变量里的路径规则,适配你实际的项目目录结构,比如源码放在当前目录src/下,就修改为SRCS := $(wildcard src/*.cpp ../common/src/AOCLUtils/*.cpp) - 如果是函数定义错误:按标准写法修正main函数的定义
- 如果是目录结构不符:将你编写的主机代码移动到
host/src/目录下,并重命名后缀为.cpp
内容的提问来源于stack exchange,提问作者user16767585
相关产品推荐
相关产品推荐

