background image

 

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. 

 

 

 

《高级语言程序设计》 谭浩强 清华大学出版社