- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++编译链接.doc
C++编译连接过程(转)
C++程序从编译到链接然后再到调用的整个过程如下。?只是个人最近观点,希望能与志同道合的同学一起讨论。?注:这里只是研究C++的主流编译过程,与Java没有任何关系,因为使用的技术完全不一样(Java是编译和解释结合的语言)。并且由于不同的编译器厂商对于程序的编译过程不尽相同,但是主要流程还是一样的。?其实长久以来我就一直很不清楚obj文件的内容到底是什么,有人说是汇编,有人说是机器语言。如果是机器语言的话,那编译的过程是怎样加入操作系统信息的呢?因为这个问题的不断扩展和困扰,便决定彻底研究一下,网上几乎找不到相关资料,作者参照了基本系统编程的书籍后自行整理而来,数目见底,仅供参考,欢迎讨论。?一个C++工程中会存在cpp文件,头文件,库文件。?1. 首先经历的是预处理过程,将头文件加载进来,并且将各种#define信息代入。这时会见不到头文件,工程经过处理后会生成以cpp文件为基础的编译单元。有人可能会问那么头文件到哪里去了。其实头文件将cpp文件中的#include替换掉了。因此在以后的编程中需要严格注意include的先后顺序。因为C++语言是一种很注重申明的语言,为什么会这样这与程序的编译过程和链接过程的算法有关。貌似话题有点转远了,其实在这个阶段是生成一个个独力的编译单元。?2. 在编译单元生成之后,便是将编译单元进行编译,其实对于主流的编译其实存在两个阶段,首先是生成汇编语言,然后使用汇编器生成机器语言。其实这里要讲解的是汇编语言怎么变成机器语言的呢。机器语言顾名思义就是0101的二进制代码。对于一个类似于MOV AX,BX(这里写的是Intel 80x86的汇编代码,其实几乎每一种不同架构的芯片的汇编语言不怎么一样)的代码而言就是将MOV和AX和BX原封不动的用0101替换掉,如MOV代码是35的话AX为01,BX为10的话翻译的机器代码就是350110,二进制也就是001101010000000100010000。?3. 接下来的任务是链接。链接的过程如下所示:?因为篇幅太长,请看附件。?其实链接的任务是生成可执行文件。?其实我的一些不确认也就在这个地方。其实每一个程序都肯定有操作系统的一些信息,比如说程序的运行环境是DOS还是Windows程序,程序的大小等。我认为编译的整个过程中应该是在最后生成可执行文件的时候加入的。?以上便是对于编译,链接的整个过程。个人意见,仅作参考。?参考资料:?1. 《Thinking in C++》 Bruce Eckel 机械工业出版社?2. 《高级语言程序设计》 谭浩强 清华大学出版社?3. 《计算机组成结构化方法》 Andrew S. Tanenbaum 机械工业出版社?4. 《计算机组成与设计 硬件/软件接口》 David A. Patterson John L. Hennessy 机械工业出版社?附件:链接器的使用?许多 Visual C++ 的使用者都碰到过 LNK2005:symbol already defined 和 LNK1169:one or more multiply defined symbols found 这样的链接错误,而且通常是在使用第三方库时遇到的。对于这个问题,有的朋友可能不知其然,而有的朋友可能知其然却不知其所以然,那么本文就试图为大家彻 底解开关于它的种种疑惑。?大家都知道,从 C/C++ 源程序到可执行文件要经历两个阶段 :?(1) 编译器将源文件编译成汇编代码,然后由汇编器 (assembler) 翻译成机器指令 ( 再加上其它相关信息 ) 后输出到一个个目标文件 (object file, VC 的编译器编译出的目标文件默认的后缀名是 .obj) 中;?(2) 链接器 (linker) 将一个个的目标文件 ( 或许还会有若干程序库 ) 链接在一起生成一个完整的可执行文件。???? 编译器编译源文件时会把源文件的全局符号 (global symbol) 分成强 (strong) 和弱 (weak) 两类传给汇编器,而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。那么何谓强弱呢?编译器认为函数与初始化了的全局变量都是强符号,而未初始化 的全局变量则成了弱符号。比如有这么个源文件 :?extern int errorno;?int buf[2] = {1,2};?int *p;?int main()?{??? return 0;?}?其中 main 、 buf 是强符号, p 是弱符号,而 errorno 则非强非弱,因为它只是个外部变量的使用声明。?有了强弱符号的概念,我们就可以看看链接器是如何处理与选择
您可能关注的文档
- 3 社会学的产生和发展(下).ppt
- 30篇文学常识练习答案.doc
- 353卫生综合.doc
- 37 大环内酯类.ppt
- 39班猪病防治试卷.doc
- 3dmax材质编辑器与灯光布置.doc
- 3、古希腊文化特色与成因.doc
- 3款凯迪拉克赛威 SLS原车屏升级加装导航系统 高清的导航.doc
- 4 保护贸易主义.ppt
- 4P 4C 4R.ppt
- CNAS-CL63-2017 司法鉴定-法庭科学机构能力认可准则在声像资料鉴定领域的应用说明.docx
- 12J7-3 河北《内装修-吊顶》.docx
- 12N2 河北省12系列建筑标准设计图集 燃气(油)供热锅炉房工程.docx
- 内蒙古 12S8 排水工程 DBJ03-22-2014.docx
- 山西省 12S10 12系列建筑标准设计 管道支架、吊架.docx
- 16J601-木门窗标准图集.docx
- 12J8 河北省12系列《 楼梯》.docx
- CNAS-GL37 2015 校准和测量能力(CMC)表示指南.docx
- CNAS-RL02-2016 能力验证规则.docx
- 津02SJ601 PVC塑料门窗标准.docx
文档评论(0)