C编译过程

学习编程,我们需要知道,计算机仅仅是一台没得感情的机器,它的所有行为都是人类赋予的。

我们所编写的C语言代码,是以".c"后缀结尾的文本文件。而计算机并不是直接执行此文件,计算机执行的是二进制格式的文件。也就是,计算机只知道‘0’和‘1’。因此,我们在完成C代码编写后,需要将".c"文件翻译成计算机能够读懂的文件,即可执行文件。这个翻译过程,我们称之为编译

可执行文件的格式在Window是环境下,一般是".exe"文件。在linux环境下是".bin"文件。在这里我们只讨论Window环境。

为了了解编译过程,我们创建一个名称为project_name的项目, 并假设该项目有2个源文件:

  1. File_name1 .c
  2. File_name2 .c

这些源文件从创建到生成可执行文件project_name.exe需要经历四个阶段。

  1. 预处理(Pre-processing)
  2. 编译(Compilation)
  3. 汇编(Assemble)
  4. 链接(Linking)

1.预处理

这是我们在集成开发环境(IDE)下,点击build命令的第一阶段。在这一阶段,执行两个主要任务:

  1. 删除所有的注释“//”和“/* * /”。
  2. 处理所有的条件编译指令,比如#if#ifdef#elif#else#endif
  3. 展开所有以#include 开头的文件和 #define开头的宏。
  4. 添加行号和文件名标识,方便后边编译时编译器产生调试用的行号心意以及编译时产生编译错误或警告时能够显示行号。
  5. 保留所有的#pragma编译指令,因为编译器需要使用它们。

预处理完成后,".c"文件会生成".i"文件。
File_name1.c ———-转换为————> File_name1.i
File_name2.c ———-转换为————> File_name2.i

2.编译

在第二阶段,将预处理完成后的文件编译成汇编文件。我们知道,汇编语言是最接近机器语言的一门编程语言,这个过程是一个语言翻译的过程,我们在此不需要深究它。编译器将创建具有一些指令集的汇编器文件(.s),并将其移交给汇编器。

编译完成后,".c"文件会生成".i"文件。
File_name1.i ———-转换为————> File_name1.s
File_name2.i ———-转换为————> File_name2.s

3.汇编

在第三阶段,汇编器会将每个文件的所有汇编指令都转换为机器代码。

编译完成后,".s"文件会生成".o"文件。
File_name1.s ———-转换为————> File_name1.o
File_name1.s ———-转换为————> File_name1.o

4.链接

在这个阶段,链接的主要工作就是将各个模块之间相互引用的部分正确的衔接起来。所有链接工作完成后,就生成了计算机能够运行的可执行文件。
executabel

以上,就是C语言编译的过程。

下一节