关于程序的编译和链接

来源:互联网 发布:布朗运动 知乎 编辑:程序博客网 时间:2024/06/05 06:05

一个源程序到一个可执行程序一般需要经过预编译、编译、汇编和链接四个步骤。当我们使用IDE编写代码的时候,这些过程IDE都会默认的为我们完成。但是了解这些过程都是做什么是很有必要的。

1、预编译

     预编译过程主要处理源文件中以“#”开始的预编译指令。比如“#include”,“#define”等,主要处理规则如下:

· 将所有的“#define”删除,并且展开所有的宏定义

· 处理所有的条件预编译指令,比如“#if”,“#ifdef”,“#endif

· 处理“#include”指令,将被包含的文件插入到该预编译指令的位置,注意这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件

· 删除所有的注释“//”、“/**/

· 添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息以及用于编译时产生的编译错误或警告时显示的行号

· 保留所有的#program编译器指令

   进过预编译后,生成的文件不包含任何的宏定义。

2、编译

    编译过程就是把预处理完的文件进过一些列的词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。

3、汇编

   汇编就是将汇编代码转变成机器可执行的指令,得到目标文件。

4、链接

   链接及时将目标文件进行处理,得到可执行文件。

举例:

 

    无论是C/C++,首先要把源文件编译成中间代码文件,在Windows下面就是.obj文件,UnixLinux下面就是.o文件,即Object File,这个动作叫编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(.o文件或是.obj文件)。

链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(.o文件或是.obj文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是.a文件。

总而言之,链接就是那些目标文件之间相互链接自己所需要的函数和全局变量,而函数可能来源于其他目标文件或库文件。



原创粉丝点击