C语言编译过程

大致分为如下几个过程,编译预处理阶段,编译阶段, 汇编阶段, 链接。
详细过程如下

1,编译预处理(gcc -E main.c -o main.i)

  • 文件包含复制 将源文件中一”#include”格式包含的文件复制到编译的源文件中
  • 宏定义替换 用实际的值替换用”#define”定义的字符串

    __DATE__:当前源程序的创建日期。
    __FILE__:当前源程序的文件名称(包括盘符和路径)。
    __LINE__:当前被编译代码的行号。
    __STDC__:返回编译器是否位标准C,若其值为1表示符合标准C,否则不是标准C.
    __TIME__:当前源程序的创建时间。 

  • 决定编译代码 根据”#if”条件决定需要编译的实际代码
  • 删除注释 行注释和块注释

2,编译(gcc -S main.i -o main.s)

  • 对预处理过后的文件进行一系列的词法分析,语法分析,语义分析以及进行相关的优化,生成相应的汇编代码文件

3,汇编(gcc -c main.c -o main.o)

  • 将编译过的汇编代码翻译成目标机器指令的过程

4,链接(ld)

  • 将不同部分的代码和数据收集和组合成为一个单一文件的过程,将相关目标指令文件链接,使其成为一个整体可以被OS执行
  • 连接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件

* 如有疑问欢迎批评指正,谢谢! *