C 语言的编译过程

2025年3月17日 | 阅读 3 分钟

什么是编译?

编译是一个将源代码转换为目标代码的过程。这是通过编译器实现的。编译器会检查源代码的语法和结构错误,如果源代码没有错误,则会生成目标代码。

Compilation process in c

C 语言的编译过程将作为输入的源代码转换为目标代码或机器代码。编译过程可以分为四个步骤,即预处理、编译、汇编和链接。

预处理器接收源代码作为输入,并移除源代码中的所有注释。预处理器处理预处理器指令并对其进行解释。例如,如果程序中包含 <stdio.h> 指令,则预处理器会解释该指令,并用 'stdio.h' 文件的内容替换该指令。

在程序被转换成可执行形式之前,它会经过以下几个阶段:

  • 预处理器
  • Compiler
  • 汇编器
  • 链接器
Compilation process in c

预处理器

源代码是在文本编辑器中编写的代码,源代码文件扩展名为 ".c"。此源代码首先传递给预处理器,然后预处理器展开此代码。展开代码后,展开的代码将传递给编译器。

Compiler

由预处理器展开的代码被传递给编译器。编译器将此代码转换为汇编代码。或者说,C 编译器将预处理后的代码转换为汇编代码。

汇编器

汇编代码通过汇编器转换为目标代码。汇编器生成的目标文件名与源文件名相同。在 DOS 中,目标文件扩展名为 '.obj',在 UNIX 中,扩展名为 'o'。如果源文件名是 'hello.c',则目标文件名将是 'hello.obj'。

链接器

主要来说,C 语言中编写的所有程序都使用库函数。这些库函数是预编译的,这些库文件的目标代码以 '.lib'(或 '.a')扩展名存储。链接器的主要工作是将库文件的目标代码与我们程序的.目标代码组合起来。有时会出现我们的程序引用了在其他文件中定义的函数的情况;此时链接器发挥着非常重要的作用。它将这些文件的目标代码链接到我们的程序中。因此,我们得出结论,链接器的任务是将我们程序的.目标代码与库文件和其他文件的.目标代码链接起来。链接器的输出是可执行文件。可执行文件的名称与源文件相同,只是扩展名不同。在 DOS 中,可执行文件的扩展名为 '.exe',在 UNIX 中,可执行文件可以命名为 'a.out'。例如,如果我们程序中使用 printf() 函数,则链接器会在输出文件中添加其关联的代码。

让我们通过一个例子来理解。

hello.c

现在,我们将创建上述程序的流程图

Compilation process in c

在上图的流程图中,执行程序需要采取以下步骤:

  • 首先,输入文件,即 hello.c,被传递给预处理器,预处理器将源代码转换为展开的源代码。展开的源代码的扩展名为 hello.i
  • 展开的源代码被传递给编译器,编译器将此展开的源代码转换为汇编代码。汇编代码的扩展名为 hello.s
  • 然后将此汇编代码发送给汇编器,汇编器将汇编代码转换为目标代码。
  • 在创建目标代码后,链接器创建可执行文件。然后加载器将加载可执行文件以进行执行。