是这样的,在学习郑莉老师的多文件结构和编译预处理命令章节时候,看到书里有这么一张图描述如下:#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++编译连接过程中关于符号表的报错分析的更多相关文章

  1. 蘑菇街TeamTalk编译连接过程中遇到的问题及解决方法(iOS)

    今天浏览博文的时候,“蘑菇街开源的即时通讯框架,包括iOS.Android.Mac.Windows客户端和后台 Github源码下载地址:https://github.com/mogujie/Team ...

  2. Coding编译连接过程中遇到的问题及解决方法(iOS)

    Coding 上下载地址:https://coding.net/u/coding/p/Coding-iOS/git Github源码下载地址:https://github.com/Coding/Cod ...

  3. kerkee demo编译连接过程中遇到的问题及解决方法(iOS)

    https://github.com/kercer/kerkee_ios 1.刚打开这个demo的时候是下图这个样子的,我们很自然的可以想到将kerkee.xcoderproj添加到项目里面 2.将k ...

  4. 【Azure 存储服务】Hadoop集群中使用ADLS(Azure Data Lake Storage)过程中遇见执行PUT操作报错

    问题描述 在Hadoop集中中,使用ADLS 作为数据源,在执行PUT操作(上传文件到ADLS中),遇见 400错误[put: Operation failed: "An HTTP head ...

  5. pythonmysql运行报错解决过程中遇到的其中一个报错解决文章来源

    本文章仅记录下面报错的解决文章来源:error: command 'C:\Users\Administrator\AppData\Local\Programs\Common\Micr osoft\Vi ...

  6. 安装Lync 2013过程中遇到的第一个报错

    安装Lync 2013, 首先要去做的就是prepare AD Forest. 在使用向导的时候会遇到报错如下: Prepare Forest Active Directory setting exe ...

  7. 解决vue项目运行过程中,npm run dev 报错问题

    [方案1] 错误如下: npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! travel@1.0.0 dev: `webpack-dev-server ...

  8. Storm编译打包过程中遇到的一些问题及解决方法

    作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2013/11/30/som ...

  9. MySQL中遇到的几种报错及其解决方法

    MySQL中遇到的几种报错及其解决方法 1.[Err] 1064 - You have an error in your SQL syntax; check the manual that corre ...

随机推荐

  1. hdu 1880 魔咒字典

    https://vjudge.net/problem/HDU-1880 题意:略 思路: 一开始就是想到了正确的思路,但是代码写炸了,死活过不了.这题嘛,就是建议一个魔咒与咒语的双向映射.首先用字符串 ...

  2. 卷积神经网络的一些经典网络2(Inception)

    在架构内容设计方面,其中一个比较有帮助的想法是使用1x1卷积.1x1卷积能做什么? 对于6x6x1的通道的图片来说,1x1卷积效果不佳,如果是一张6x6x32的图片,那么使用1x1卷积核进行卷积效果更 ...

  3. Maven 私服的简单使用

    所有的 Java 开发者应该是没有没用过 Maven 的吧.Maven 作为 Java 项目管理工具,它不仅可以用作包管理,还有许多的插件,可以支持整个项目的开发.打包.测试.部署等一系列行为.而包管 ...

  4. 对于手机APP偷窥个人隐私,你怎么看

    经过进两周的持续发酵,Facebook5000万用户数据泄露事件,已让其处在舆论的风尖浪口.对于手机APP泄漏用户个人隐私问题,再次受到人们的关注.对于这个问题,你会怎么看? 隐私,即不愿公开的个人信 ...

  5. MyBatis(2)——MyBatis 深入学习

    编写日志输出环境配置文件 在开发过程中,最重要的就是在控制台查看程序输出的日志信息,在这里我们选择使用 log4j 工具来输出: 准备工作: 将[MyBatis]文件夹下[lib]中的 log4j 开 ...

  6. [LeetCode] Reshape the Matrix 重塑矩阵

    In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new o ...

  7. 数据结构与算法 —— 链表linked list(04)

    我们在上篇文章里面提到了链表的翻转,给定一个链表,对每两个相邻的节点作交换,并返回头节点,今天的这道题是它的升级版,如下: k个一组翻转链表 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链 ...

  8. [HNOI 2012]集合选数

    Description 题库链接 对于任意一个正整数 \(n\) ,求出集合 \(\{1,2,\cdots,n\}\) 的满足约束条件"若 \(x\) 在该子集中,则 \(2x\) 和 \( ...

  9. [HNOI2013]数列

    题目描述 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到:除第一天外每天的股价都比前一天高,且高出 ...

  10. 【NOIP2016】愤怒的小鸟

    题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...