翻译环境

编译和链接实际上是c语言中的翻译环境,在这个环境中,源代码会被转化成机器可执行的二进制指令。而在c语言中存在两个不同的环境,包括前面的翻译环境,以及运行环境。运行环境用于执行经过翻译环境后的二进制指令。

翻译环境由编译和链接组成,而编译又可分为预编译(预处理)、编译、汇编。

c语言的编译和链接_编译

编译

在编译阶段,多个.c文件单独经过编译器,编译转化为对应的目标程序.obj文件(在linux环境下为.o后缀的文件)。具体将分为三个过程。

预编译

在预编译阶段,源文件和头文件会被处理成.i为后缀的文件。在预编译阶段主要处理那些源文件中#开始的预编译指令。比如:#include,#define等。经过预编译后的.i文件中不再包含宏定义,因为宏已经被展开。并且包含的头⽂件都被插⼊到.i文件中。所以当我们无法知道宏定义或者头文件是否包含正确的时候,可以查看预处理后的.i文件来确认。

编译

编译过程就是将预编译后的文件进行一系列的词法分析、语法分析、语法分析及优化等,生成相对应的汇编代码文件。

汇编

在汇编过程中,使用汇编器将汇编代码转化成机器可执行的指令,每一个汇编代码都对应一个指令,根据汇编指令和机器指令的对照表进行翻译,不做指令优化。

链接

链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。 链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。比如在一个项目中的test1.c和test2.c,可以通过相应的方法链接到一起,其中的函数等可以相互调用。

c语言的编译和链接_C语言_02

                                                  编译和链接过程图