是这样的,在学习郑莉老师的多文件结构和编译预处理命令章节时候,看到书里有这么一张图描述如下:#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. python——常用模块2

    python--常用模块2 1 logging模块 1.1 函数式简单配置 import logging logging.debug("debug message") loggin ...

  2. requests+xpath+map爬取百度贴吧

    # requests+xpath+map爬取百度贴吧 # 目标内容:跟帖用户名,跟帖内容,跟帖时间 # 分解: # requests获取网页 # xpath提取内容 # map实现多线程爬虫 impo ...

  3. PHP实现统计在线人数功能示例

    本文实例讲述了PHP实现统计在线人数的方法.分享给大家供大家参考,具体如下: 我记得ASP里面统计在线人数用application 这个对象就可以了.PHP怎么设计? PHP对session对象的封装 ...

  4. [JCIP笔记](四)踩在巨人的肩上

    读完第三章那些繁琐的术语和细节,头疼了整整一个星期.作者简直是苦口婆心,说得我如做梦一般.然而进入第四章,难度骤然降低,仿佛坐杭州的过山公交车突然下坡,鸟鸣花香扑面而来,看到了一片西湖美景. 从开始看 ...

  5. 解决MySQL在修改列时因为外键依赖出错的问题

    因为 favorite_food 中的 person_id 对 person 表中的 person_id 有外键依赖关系,所以在执行 ALTER TABLE person MODIFY person_ ...

  6. css 相关算法

    计算 em 目标像素 除 基准像素 等于 em倍数结果: 14 / 16 = 0.875em 0.875倍也就是 14 像素 计算百分比 目标像素 除 父类总宽度 乘 一百:90 / 200 * 10 ...

  7. Spring Boot简单应用——会员管理系统

    简介 本项目是使用Spring Boot编写的一个简单的会员管理系统. 提供了会员的解决方案,主要有会员模块,管理员模块,礼品模块,商品模块,会员等级模块,生日提醒模块,积分模块,详细模块如下图 准备 ...

  8. ftp爆破(python脚本)

    最近在乌云看到一份端口详解:为了锻炼自己,按照端口详解写脚本 #!/usr/local/bin/ python #-*- coding: UTF-8 -*- __author__ = '' from ...

  9. 决战 状压dp

    决定在这个小巷里排兵布阵.小巷可以抽象成一个们彼此之间并不是十分和♂谐.具体来说,一个哲学家会有一个的矩形.每一位哲学家会占据一个格子.然而哲学家的01矩阵来表示他自己的守备范围.哲学家自己位于这个矩 ...

  10. hdu 5429(大数模板)

    题意:判断是否是等比数列 a[i] * a[i] = a[i+1] * a[i-1]   +   部分为0 的情况 /*  表示还没学java.... ,模板来自NK_test #include &l ...