从链接器的角度详细分析g++报错: (.text+0x24): undefined reference to `main'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status
在使用g++编译链接两个C++源文件main.cpp以及VecAdd.cpp时出现了以上编译报错。main.cpp中引用了VecAdd.cpp中定义的函数vecAdd来实现两个向量的加法。我们先说原因,再来分析一下g++为什么会报这样的错误。出现这个error的根本原因是错误地将g++命令行指令
linux> g++ -o main main.cpp VecAdd.cpp
写成了
linux> g++ -o main.cpp VecAdd.cpp
这样,g++会认为我们想要对VecAdd.cpp进行编译,得到一个名为main.cpp的可执行文件。而违背了我们的本意:将main.cpp与VecAdd.cpp编译并链接,得到可执行文件main. 在实验下,以上错误的指令不仅达不成我们的目的,还会将我们的C++源文件main.cpp给吃掉,很傻:

再从链接器的角度审视一下这个错误:第一行的目录/usr/bin/ld是链接器的路径,第二行的(.text+0x24)表示目标文件出现错误的地方,也就是VecAdd.cpp对应的ELF格式的目标文件.text这一节(代码段)中地址偏移为0x24的地方。这里的undefined reference to main是什么意思? 一开始作者以为是对“main”这个符号的引用没有被定义,后来发现不是这样。做了实验后,发现真正的原因是:“在VecAdd.cpp中没有定义main函数”。我们编写了一个test.cpp.其中只有一条变量定义语句:
//test.cpp
int a = 5;
使用指令
linux> g++ -o test test.cpp
来将test.cpp编译成可执行文件,发现链接器报了同样的错误:

于是,问题得到了解答:g++ 的 -o 选项是将源代码编译成可执行文件,而C++源程序的程序入口是main函数,在最初的例子中:
linux> g++ -o main.cpp VecAdd.cpp
由于错误输入,这条指令这是将VecAdd.cpp编译成名为main.cpp的可执行文件,而VecAdd.cpp中实现的是向量加法函数vecAdd,该源文件并没有主函数main(),于是就出现了"undefined reference to main"的链接器报错。
可以通过使用IDE、编写shell脚本、使用cmake工具等更安全的工具,从而减少这样的失误带来的问题。
从链接器的角度详细分析g++报错: (.text+0x24): undefined reference to `main'的更多相关文章
- g++编译时遇到问题undefined reference to
文件目录结构体为: src 和include 分别用来存放.cpp文件和 .hpp文件 其中:src文件夹下有需要的文件 simulator_client.cpp crc32.cpp : includ ...
- EasyPlayerPro(Windows)流媒体播放器开发之ffmpeg log输出报错
EasyPlayerPro主要基于ffmpeg进行开发,在EasyPlayerPro开发过程中,曾遇到一个相对比较棘手的问题,该问题一般在播放不是很标准的流或者网络情况较差,容易出现丢帧的情况特别容易 ...
- Eigensoft-smartpca分析PCA报错:warning (mapfile): bad chrom: Segmentation fault
目录 问题 解决 问题 一直以来用Eigensoft的smartpca来做群体遗传的PCA分析很顺畅,结果也比较靠谱. 但今天报错如下: $ ~/miniconda3/bin/smartpca -p ...
- 关于App自动化执行链接Appium服务包名正确但是报错An unknown server-side error occurred while processing the command
在执行链接Appium服务时连接失败可能原因: 1.报错截图: 2.先检查包名是否正确(正常情况下包名不会错误)通过命令行查看包名:aapt dump badging xxx.apk 3.检查对应包的 ...
- g++报错原因分析:expected class-name before ‘{’ token
今天写程序的时候, 遇到这样一个错误expected class-name before ‘{’ token 最后发现原来是我的头文件声明没有加. 继承时不要忘记加基类的头文件 错误: class F ...
- 看详细的tomcat报错信息
WEB-INF/classes目录下新建一个文件叫logging.properties handlers = org.apache.juli.FileHandler, java.util.loggin ...
- svn断开链接后,重新share提交代码报错
前言:svn怎样断开链接并清除干净请查看此地址-->android studio中断开SVN连接,并彻底清理项目中的.svn文件 1.每次把项目重新关联到新的svn地址上,我都抓狂一样的烦躁,因 ...
- Mac下通过命令行安装npm install -g 报错,如何解决?
1, 使用 sudo npm install -g n2, 或者 sudo chmod -R 777 /usr/local/lib,然后 npm install -g
- 【服务器踩坑】SSMS链接Ubuntu上的SQL Server 2019 报错 TCP Provider: Error code 0x2746
昨天在一台Ubuntu18.04.2 上安装了SQL Server 2019 for Linux 服务正常启动了,但是却无法通过命令行工具或者远程Windows机器上的SSMS链接. SSMS错误是 ...
- 使用 jsErrLog 分析 js 报错
1. github 地址: https://github.com/Offbeatmammal/jsErrLog/tree/master/src 2. 在所有页面引入 jsErrLog,配置出错时打日志 ...
随机推荐
- Java猜数字,猜完一局以后,输入y继续下一次游戏,否则结束
代码如下: public static void main(String[] args) { String x = ""; do { int random = (int) (Mat ...
- Seal AppManager v0.2 发布:进一步简化应用部署体验
经过近3个月的研发,Seal AppManager v0.2 已正式发布. Seal AppManager 是一款基于平台工程理念的应用统一部署管理平台,于今年4月首次推出.在上一版本中,我们已经释出 ...
- 使用C#编写.NET分析器(三)
译者注 这是在Datadog公司任职的Kevin Gosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断).IDE.诊断 ...
- 开源BaaS平台Supabase介绍
Supabase 介绍 Supabase 是一个开源的 Firebase 替代品,以BaaS的形式向各种应用程序提供了一系列的后端功能,可以帮助开发者更快地构建产品. 对于想快速实现一个产品而言,如果 ...
- Python数据分析易错知识点归纳(五):横向对比
五.横向对比 排序 # 列表 a.sort() # 修改原列表,返回值为None!!!!!这里很容易出错 sorted(a) # 生成新的列表 # 嵌套列表的排序(若是对字典排序,需先用list()转 ...
- 大白话讲讲 Go 语言的 sync.Map(二)
上一篇文章 <大白话讲讲 Go 语言的 sync.Map(一)> 讲到 entry 数据结构,原因是 Go 语言标准库的 map 不是线程安全的,通过加一层抽象回避这个问题. 当一个 ke ...
- mysql:EXPLAIN
推荐阅读原文:EXPLAIN用法和结果分析 语法:EXPLAIN SELECT * FROM t1 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句 ...
- python 镜像
https://pypi.douban.com/simple/ 豆瓣源 pip install -i https://pypi.douban.com/simple/ pymysql # pymys ...
- 如何配置Linux的互信
如何配置Linux的互信? 这里针对的是root用户的,普通用户家目录/home/test/.ssh. 1.在客户端生成公钥私钥对 [root@auto1 ~]# ssh-keygen -t rsa ...
- linux离线安装docker与compose
前言 系统版本:centos 7.ubuntu 20.04 docker版本:v19.03.9.官方下载地址 docker-compose版本:v2.2.3.官方下载地址 官方提供免安装的二进制程序包 ...