是这样的,在学习郑莉老师的多文件结构和编译预处理命令章节时候,看到书里有这么一张图描述如下:#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. javascript获取表单的各项值

    何谓表单? 表单是html页面中负责数据采集功能的部件,它往往由三个部分组成: 表单标签:<form></form> 用于声明表单的范围,位于表单标签中的元素将被提交.属性有m ...

  2. javascript 函数的4种调用方式与 this(上下文)的指向

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! javascript中作用域链和this(上下文)的指向是很容易混淆的,简单的说就是: 作用域链取决于函数 ...

  3. Spring(5)——Spring 和数据库编程

    传统 JDBC 回顾 JDBC 我们一定不陌生,刚开始学习的时候,我们写过很多很多重复的模板代码: public Student getOne(int id) { String sql = " ...

  4. 单例模式详解及java常用类

    [单例模式]      确保某一个类,只能产生一个实例. 设计思路: ====将构造函数私有化,确保类外部,不能使用new关键字自行创建对象. ====在类内部实例化一个对象,并通过静态方法返回. ( ...

  5. 修改 iOS AppIcon

    有一次看到亚马逊的客户端打开后,就提示 icon 改变了,回桌面一看,竟然真的变了.然后就上网搜索是怎么实现的,参照着写了一个小 demo ,权当笔记. 首先,导入图片到项目的中,如下图.不要导入到 ...

  6. Hibernate | Spring JPA | MySQL 使用过程遇到的一些问题

    1. 使用过程 2. 背景 3. 遇到问题 3.1 不指定Hibernate数据库方言,默认SQL生成方式 3.2 抛出异常Hibernate加入了@Transactional事务不会回滚 3.3 H ...

  7. vba打开输入文件

    Sub fileCreate2() Dim folderPath, fileName, s As String Dim fs, fo, fc, f As Object folderPath = &qu ...

  8. OC/Swift/C/C++混合使用的编程姿势

    一,OC调用C语言方法 1.OC中的.m文件对C语言完全兼容,可以直接导入C头文件,进行使用 2.定义一个.c的C语言文件,在.m文件中导入,就可以使用.   二,OC调用C++语言方法 1.需要将. ...

  9. [FJOI2014]最短路径树问题

    Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最 ...

  10. ●SPOJ LCS2Longest Common Substring II

    题链: http://www.spoj.com/problems/LCS2/题解: 后缀自动机. 对第一个串建立后缀自动机, 然后把后面的每个串分别与该串的自动机去匹配,求出相应的数组val*[s]: ...