/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'的更多相关文章

  1. g++编译时遇到问题undefined reference to

    文件目录结构体为: src 和include 分别用来存放.cpp文件和 .hpp文件 其中:src文件夹下有需要的文件 simulator_client.cpp crc32.cpp : includ ...

  2. EasyPlayerPro(Windows)流媒体播放器开发之ffmpeg log输出报错

    EasyPlayerPro主要基于ffmpeg进行开发,在EasyPlayerPro开发过程中,曾遇到一个相对比较棘手的问题,该问题一般在播放不是很标准的流或者网络情况较差,容易出现丢帧的情况特别容易 ...

  3. Eigensoft-smartpca分析PCA报错:warning (mapfile): bad chrom: Segmentation fault

    目录 问题 解决 问题 一直以来用Eigensoft的smartpca来做群体遗传的PCA分析很顺畅,结果也比较靠谱. 但今天报错如下: $ ~/miniconda3/bin/smartpca -p ...

  4. 关于App自动化执行链接Appium服务包名正确但是报错An unknown server-side error occurred while processing the command

    在执行链接Appium服务时连接失败可能原因: 1.报错截图: 2.先检查包名是否正确(正常情况下包名不会错误)通过命令行查看包名:aapt dump badging xxx.apk 3.检查对应包的 ...

  5. g++报错原因分析:expected class-name before ‘{’ token

    今天写程序的时候, 遇到这样一个错误expected class-name before ‘{’ token 最后发现原来是我的头文件声明没有加. 继承时不要忘记加基类的头文件 错误: class F ...

  6. 看详细的tomcat报错信息

    WEB-INF/classes目录下新建一个文件叫logging.properties handlers = org.apache.juli.FileHandler, java.util.loggin ...

  7. svn断开链接后,重新share提交代码报错

    前言:svn怎样断开链接并清除干净请查看此地址-->android studio中断开SVN连接,并彻底清理项目中的.svn文件 1.每次把项目重新关联到新的svn地址上,我都抓狂一样的烦躁,因 ...

  8. Mac下通过命令行安装npm install -g 报错,如何解决?

    1, 使用 sudo npm install -g n2, 或者 sudo chmod -R 777 /usr/local/lib,然后 npm install -g

  9. 【服务器踩坑】SSMS链接Ubuntu上的SQL Server 2019 报错 TCP Provider: Error code 0x2746

    昨天在一台Ubuntu18.04.2 上安装了SQL Server 2019 for Linux 服务正常启动了,但是却无法通过命令行工具或者远程Windows机器上的SSMS链接. SSMS错误是 ...

  10. 使用 jsErrLog 分析 js 报错

    1. github 地址: https://github.com/Offbeatmammal/jsErrLog/tree/master/src 2. 在所有页面引入 jsErrLog,配置出错时打日志 ...

随机推荐

  1. 了解O2OA(翱途)开发平台中的VIP应用

    使用O2OA(翱途)开发平台可以非常方便地进行项目的业务需求开发与实施,O2OA(翱途)开发平台并不限制实现的系统类型,所以能实现的系统很多,最终呈现的项目成果也是多样性的,可能是OA系统,可能是人力 ...

  2. 现代C++(Modern C++)基本用法实践:零、概述&测试项目

    序言 习惯上,我们把C++11之前的C++语法特性称之为"传统C++(traditional c++)",而把c++11之后的语法特性称之为现代C++(modern c++).有一 ...

  3. SketchUp Pro 2023 下载和安装教程

    SketchUp Pro 2023 下载和安装教程 下载链接 123云盘:https://www.123pan.com/s/JyAKVv-NTXB.html 安装教程 演示操作系统:Windows 1 ...

  4. 2021-3-13 xml的增删改查

    public void XmlAdd(string filename, List<People> pList) { try { List<People> peoples = X ...

  5. vue项目node_modules文件过大问题

    node_modules目录下.cache下最大文件删除即可(vue-loader)

  6. QMainWindow类中比较重要的方法

    方法和描述 addToolBar():添加工具栏 centralWidget():返回窗口中心的一个空间,未设置时返回NULL menuBar(): 返回主窗口的菜单栏 setCentralWidge ...

  7. 快速了解DevSecOps:构建安全软件开发的基石!

    关键词 DevSecOps - 在不影响敏捷性的前提下,将安全充分融入到SDLC的所有环节中 SDLC-软件交付生命周期 SCA-软件组成分析-用于识别和检测软件中使用的开源/第三方组件的已知安全漏洞 ...

  8. debian11安装mysql5.7

    前言 mysql官网5.7版本的只找到debian10的,没有debian11的,试了下也能用. 系统版本:debian 11 mysql版本:5.7.35 步骤 下载bundle的tar包.官网地址 ...

  9. 通过python,将excel中的数据写入二维列表

    需求:读取Excel表中数据,每行数据放在一个列表中,再把所有列表都存入到一个列表中,形成二维列表. 实现方法:导入可在Python处理Excel表格数据的模块. excel表: 方法一:xlwing ...

  10. 【技术实战】Vue功能样式实战【六】

    需求实战一 样式展示 代码展示 <template> <ARow> <ACol style="background-color:#F1F4F5 "&g ...