概要
编译共分为四个流程:
1、预处理
2、编译
3、汇编
4、链接
相关命令
下图是多个文件一起编译的情况:
预处理
#define two 1//宏定义
//条件编译
#ifdef two
//如何宏定义了two则执行这里面的代码
#endif
#include “stdio.h”//文件包含
gcc -E hello.c -o hello.i
预编译过程主要处理那些源代码中以#开始的预编译指令,主要处理规则如下:
-
将所有的#define删除,并且展开所有的宏定义;
-
处理所有条件编译指令,如#if,#ifdef等;
-
处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。
-
删除所有的注释。
-
添加行号和文件标识,如#9 “usart.c” 9,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息;
编译
gcc -S hello.i -o hello.s
编译器会将预处理完的 .i 文件进行一些列的语法分析,并优化后生成对应的汇编代码。会生成 .s 文件
汇编
gcc -c hello.s -o hello.o
汇编器会将编译器生成的 .s 汇编程序汇编为机器语言或指令,也就是可以机器可以执行的二进制程序。会生成 .o 文件。
链接
gcc hello.o -o hello
链接器会来链接程序运行的所需要的目标文件,以及依赖的库文件,最后生成可执行文件,以二进制形式存储在磁盘中