C语言教程-详解 C 语言的编译过程

什么是编译?
编译是将源代码转换为目标代码的过程。它借助编译器来完成。编译器检查源代码是否存在语法或结构错误,如果源代码没有错误,那么它将生成目标代码。
C 语言的编译过程 C 语言的编译过程将输入的源代码转换为目标代码或机器代码。编译过程可以分为四个步骤,即预处理、编译、汇编和链接。
预处理器接收源代码作为输入,并从源代码中删除所有注释。预处理器还会解释预处理指令。例如,如果程序中有 <stdio.h> 这样的指令,预处理器会解释该指令,并将其替换为 'stdio.h' 文件的内容。
在转化为可执行形式之前,我们的程序会通过以下阶段:
- 预处理器
- 编译器
- 汇编器
- 链接器
预处理器
源代码是在文本编辑器中编写的代码,源代码文件的扩展名为 ".c"。首先将源代码传递给预处理器,然后预处理器会对代码进行展开。展开后的代码会被传递给编译器。
编译器
预处理器展开的代码会被传递给编译器。编译器将这段代码转换为汇编代码。或者可以说,C 编译器将经过预处理的代码转换为汇编代码。
汇编器
使用汇编器将汇编代码转换为目标代码。汇编器生成的目标文件与源文件具有相同的名称。在 DOS 中,目标文件的扩展名为 '.obj',而在 UNIX 中,扩展名为 'o'。如果源文件的名称是 'hello.c',那么目标文件的名称将是 'hello.obj'。
链接器
大多数使用 C 编写的程序都会使用库函数。这些库函数已经经过预编译,库文件的目标代码以 '.lib'(或 '.a')为扩展名存储。链接器的主要工作是将库文件的目标代码与我们的程序的目标代码合并。有时候我们的程序会引用其他文件中定义的函数,这时链接器就起到了非常重要的作用。它将这些文件的目标代码与我们的程序进行链接。因此,我们可以得出结论,链接器的工作是将我们的程序的目标代码与库文件和其他文件的目标代码进行链接。链接器的输出是可执行文件。可执行文件的名称与源文件相同,只是扩展名不同。在 DOS 中,可执行文件的扩展名为 '.exe',而在 UNIX 中,可执行文件的名称可以是 'a.out'。例如,如果我们在程序中使用了 printf() 函数,链接器会将其关联的代码添加到输出文件中。
#include <stdio.h>
int main() {
printf("Hello, World!");
return 0;
}
现在,我们将创建上述程序的流程图:
C 语言的编译过程 在上面的流程图中,执行程序需要经过以下步骤:
- 首先,将输入文件(即 hello.c)传递给预处理器,预处理器将源代码转换为展开的源代码。展开的源代码的扩展名将是 hello.i。
- 展开的源代码将传递给编译器,编译器将展开的源代码转换为汇编代码。汇编代码的扩展名将是 hello.s。
- 然后,将汇编代码传递给汇编器,汇编器将汇编代码转换为目标代码。
- 创建了目标代码后,链接器将创建可执行文件。加载器将加载可执行文件以进行执行。