gcc main.c-->main.exe详细过程:
- 预编译:gcc -E main.o -o main.i
预编译过程主要处理那些源代码中以“#”开始的预编译指令。比如”#include”、”#define”等。处理规则如下:
·将所有的”#define”删除。并展开所有宏定义。
·处理所有条件预编译指令。比如“#if”(如果条件为真,则编译下面代码)“#ifdef”(如果宏已经定义,则编译下面代码)、“elif”(如果前面的#if不为真,当前条件为真,则编译下面代码)“endif”(结束一个#if.....#else条件编译块)
·处理“#include”编译指令,将被包含的文件插入到该预编译指令的位置。这个过程时递归的,也就是说被包含的文件可能还包含其他文件。
·删除所有注释。
·添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息及编译时产生编译错误或警告是=时能够显示行号。
·保留所有的#pragma(设置编译器状态或者是指示编译器完成一些特定的动作)编译器指令,因为编译器必须使用他们。
经过编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到.i中。所以当我们无法判断宏定义是否正确或者头文件包含是否正确时,可以查看预编译后的文件来确定问题。
(2)编译:gcc -s main.i -o main.s
编译过程就是把预处理的文件进行一系列词法分析、语法分析,语义分析及优化后生成相应的汇编代码文件,这个过程是程序构建的核心部分,也是最复杂的部分之一。
(3)汇编:gcc -c main.c -o main.o
汇编是将汇编代码转成机器可执行的指令,每一个汇编指令语句几乎都对应这一条机器指令,所以汇编器的汇编过程是根据汇编指令和机器指令的对照表一一翻译来的。
(4)链接:gcc -o main main.c
链接主要就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确的衔接。链接的主要过程包括地址和空间分配、符号决议和重定位等步骤。