C++编译连接过程中关于符号表的报错分析
是这样的,在学习郑莉老师的多文件结构和编译预处理命令章节时候,看到书里有这么一张图描述如下:#include指令作用是将指定的文件嵌入到当前源文件中#include指令所在的位置。
然后我就想5_10.cpp主程序直接include了point.cpp也可以吧(因为point.cpp里include了point.h,这样既有声明又有定义)。没错,书中继续描述被嵌入的文件可以是.h文件,也同样可以是.cpp文件。但是当我在eclipse for c++环境里验证的时候却打脸了,让我一度怀疑是不是不能#include .cpp。
eclipse中在连接的那一步报错了,如下:
并没有认真看eclipse中报错内容的我在vim中一顿操作验证结果明明可以引入cpp的啊。上半部分是include .h的测试,下半部分是include .cpp的测试,都可以看出在生成.o文件也就是编译生成目标代码并没啥错,就在连接步骤引入.h的却报错,引入.cpp却正常(这结果与在eclipse中刚好相反啊),这不禁让我思考了起来,哦发现了,在命令行中我是用命令指定编译哪个cpp文件,在引入.h的test.cpp测试中我只编译了test而没有编译也没连接point.cpp,所以连接时候找不到函数地址就很正常了(可以注意到它报的错是undefined,而eclipse中报的是duplicate,这就是区别...)
回到eclipse,往上翻错误,看到eclipse好像是把我项目底下所有cpp都给编译了,一看果然是...emmm make all。其实编译就编译吧也没有啥影响最后别连接那些我没用的就行,但是可以看到这个真的是linker 了all啊..
由于我在main.cpp中include了6文件夹的Point.cpp,这就相当于把6文件夹下的Point.cpp编译了两次(产生了两个关于point.cpp的符号表,关于什么是符号表,就是把程序中各个标识符名称和它们在各段中的地址关联起来的数据结构,见下图)。然后在连接的时候,是将各个编译单元的目标文件和运行库当中被调用过的单元加以合并,经过合并后不同编译单元代码段和数据段就分别合并到一起,与此同时,各个目标文件的符号表也可以被综合起来,连接最后符号表的每个条目都必须有确定的地址。然而eclipse连接报错就报错在符号表的函数地址应该是什么,main中所引用的Point.cpp和6文件夹的Point.cpp是一个东西,但却在生成.o文件时候符号表中的Point类的各个函数各自有了地址。
符号表能够被正确综合的一个前提是,对于同一个符号,只在刚好一个编译单元中有定义,而在其他编译单元中是未定义的。之所以有这个要求是因为合并后符号表中各个符号的地址需要根据该符号在有定义的编译单元中的相对地址来确定。若在多个编译单元中同一个符号都有定义地址,那么它的地址将无所适从,就会出现符号定义冲突的连接错误。所以可以看到eclipse给出的错误提示是"duplicate symbol".
其中形如__ZN5...的名字是函数名,在符号表中函数并不只以它在源程序中的名字命名,函数在符号表中的名字至少包括源程序的函数名和参数表类型信息。因为函数可以重载,由于符号表中没有专门的类型信息,参数表信息只能在名字中有所体现,否则在目标文件中无法对函数名相同单参数不同的函数加以区分。look,其中move函数就是我point类中定义的一个成员函数,剩下的都是构造函数(我定义的+类中默认的其他构造)或析构函数把。所以,看来在eclipse中要非想引用cpp文件就要自己重写eclipse中的make文件咯。
C++编译连接过程中关于符号表的报错分析的更多相关文章
- 蘑菇街TeamTalk编译连接过程中遇到的问题及解决方法(iOS)
今天浏览博文的时候,“蘑菇街开源的即时通讯框架,包括iOS.Android.Mac.Windows客户端和后台 Github源码下载地址:https://github.com/mogujie/Team ...
- Coding编译连接过程中遇到的问题及解决方法(iOS)
Coding 上下载地址:https://coding.net/u/coding/p/Coding-iOS/git Github源码下载地址:https://github.com/Coding/Cod ...
- kerkee demo编译连接过程中遇到的问题及解决方法(iOS)
https://github.com/kercer/kerkee_ios 1.刚打开这个demo的时候是下图这个样子的,我们很自然的可以想到将kerkee.xcoderproj添加到项目里面 2.将k ...
- 【Azure 存储服务】Hadoop集群中使用ADLS(Azure Data Lake Storage)过程中遇见执行PUT操作报错
问题描述 在Hadoop集中中,使用ADLS 作为数据源,在执行PUT操作(上传文件到ADLS中),遇见 400错误[put: Operation failed: "An HTTP head ...
- pythonmysql运行报错解决过程中遇到的其中一个报错解决文章来源
本文章仅记录下面报错的解决文章来源:error: command 'C:\Users\Administrator\AppData\Local\Programs\Common\Micr osoft\Vi ...
- 安装Lync 2013过程中遇到的第一个报错
安装Lync 2013, 首先要去做的就是prepare AD Forest. 在使用向导的时候会遇到报错如下: Prepare Forest Active Directory setting exe ...
- 解决vue项目运行过程中,npm run dev 报错问题
[方案1] 错误如下: npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! travel@1.0.0 dev: `webpack-dev-server ...
- Storm编译打包过程中遇到的一些问题及解决方法
作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2013/11/30/som ...
- MySQL中遇到的几种报错及其解决方法
MySQL中遇到的几种报错及其解决方法 1.[Err] 1064 - You have an error in your SQL syntax; check the manual that corre ...
随机推荐
- TSQL:A表字段与B表中的关联,关联条件中一列是随机关联的实现方式
A表字段与B表中的关联,关联条件中一列是随机关联的实现方式 create table test( rsrp string, rsrq string, tkey string, distan strin ...
- hdu1789 Doing Homework again---(经典贪心)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1789 题目大意: 给出N个作业的截至日期,和N个作业不交所扣掉的分数,要求输出扣除分数做少的方案. ...
- Java 局部变量、实例变量、类变量(静态变量)区别
1. 局部变量: 局部变量是类的方法中的变量: 2. 实例变量: 实例变量也是类中独立于方法之外的变量,不过没有static修饰,也叫 对象变量 3. 类变量(静态变量): 类变量是类中独立于方法之外 ...
- 利用JS去做响应式布局
利用JS去做响应式布局 js动态改变布局方式 // 取浏览器可视区高宽 var lw = $(window).width(); var lh = $(window).height();// 页面加载完 ...
- [LeetCode] Max Stack 最大栈
Design a max stack that supports push, pop, top, peekMax and popMax. push(x) -- Push element x onto ...
- js 函数 作用域 全局作用域 局部作用域 闭包
一个变量没有声明但调用 直接报错,声明没有赋值会显示未定义. 作用域 作用域(scope):一条数据可以在哪个范围中使用. 通常来说,一段程序代码中所用到的数据并不总是有效/可用的,而限定这个数据的可 ...
- CCA更新流程分析
1 CCA CCA(空间信道评估)在CSMA/CA中比较非常重要,事关整机吞吐量,所以对其实现进行简单分析.CCA好像应该有2种:CCA-CS,是属于PLCP层的,捕获到能量且能量值高于-82dB后, ...
- xml 和数组的相互转化
数组转化为xml: function arrtoxml($arr,$dom=0,$item=0){ if (!$dom){ $dom = new DOMDocument("1.0" ...
- 计科1702冯亚杰C语言程序设计预备作业
阅读邹欣老师的博客--师生关系,针对文中的几种师生关系谈谈你的看法,你期望的师生关系是什么样的? 答:首先老师和学生之间要互相尊重,我认为这是必要的.在第一点的基础上师生要互相帮助,互相配合,共同进步 ...
- glusterfs 4.0.1 rpc 分析笔记1
Jimmy的文档:Glusterfs的rpc模块分析 第一节.rpc服务器端实现原理及代码分析 第二节.rpc客户端实现原理及代码分析 第三节.rpc通信过程分析 经过阅读源码对比之前提及的文档,我个 ...