GCC 编译器对程序的编译下图所示,分为 4 个阶段:预处理(预编译)、编译和优化、汇编和链接。GCC 的编译器可以将这 4 个步骤合并成一个。
预处理:在这个阶段主要做了三件事: 展开头文件 、宏替换 、去掉注释行
*这个阶段需要 GCC 调用预处理器来完成,最终得到的还是源文件,文本格式
编译:这个阶段需要 GCC 调用编译器对文件进行编译,最终得到一个汇编文件
汇编:这个阶段需要 GCC 调用汇编器对文件进行汇编,最终得到一个二进制文件
链接:这个阶段需要 GCC 调用链接器对程序需要调用的库进行链接,最终得到一个可执行的二进制文件
后缀 | 说明 | 参数 |
.c | 源文件 | - |
.i | 预处理后的 C 文件 | -E |
.s | 编译之后得到的汇编语言的源文件 | -S |
.o | 汇编后得到的二进制文件 | -c |
第一步:对源文件进行预处理,需要使用的 gcc 参数为 -E
# 1. 预处理, -o 指定生成的文件名
$ gcc -E main.c -o main.i
第二步:编译预处理之后的文件,需要使用的 gcc 参数为 -S
# 2. 编译, 得到汇编文件
$ gcc -S main.i -o main.s
第三步:对得到的汇编文件进行汇编,需要使用的 gcc 参数为 -c
# 4. 链接
$ gcc main.o -o main
第四步:将得到的二进制文件和标准库进制链接,得到可执行的二进制文件,不需要任何参数
# 4. 链接
$ gcc main.o -o main
上面4个步骤可以合为一个
# 该命令是直接进行链接生成可执行程序, 链接之前的三步会自动执行
$ gcc main.c -o main