编写好的 C 程序源码 (*.c) 是个某种编码格式下的文本文件,需要被 “翻译” 成机器语言表示的可执行程序,这个过程被称为 编译 。(此处的 编译 是下文四个步骤的统称,与步骤二有所区分。)
C 程序的编译过程可以分为以下四个步骤:
- 预处理 (Preprocessing)
- 编译 (Compilation)
- 汇编 (Assemble)
- 链接 (Linking)
预处理 (Preprocessing)
预处理过程读取 C 程序源码 (*.c) 的文本内容,按照预处理指令 (例如头文件包含、宏定义等) 替换 相应的文本内容。
预处理过程的输出文件仍然是文本文件 (*.i) ,但是文件体积比输入文件大。
编译 (Compilation)
编译过程将预处理后的程序文本 (*.i) 转换成汇编代码 (Assembly Code / *.s) 。
汇编 (Assemble)
汇编过程将汇编代码 (*.s) 转换成与指定硬件相匹配的机器码 (Machine Code) 。
汇编过程的输出文件被称为目标文件 (*.o) ,这是一种是二进制文件。
对于每一个源码文件 (*.c) ,汇编后将产生相应的目标文件。
链接 (Linking)
链接过程将项目中的多个目标文以及所需的库文件链接成最终的可执行文件 (Executable File) 。
现在有些编译器 (例如GCC) ,把预处理、编译和汇编三个步骤一次性完成,称为 编译 操作,并把 链接 作为第二个步骤生成二进制的可执行程序。
也有一些编译器会将四个步骤一次性完成,直接生成二进制的可执行程序。