编译四大过程
1 预处理
完成宏替换、文件引入,以及去除空行、注释等,为下一步的编译做准备。
对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。
//test.c
#include <stdio.h>
int main(){
printf("hello world!\n");
return 0;
}
#-E:gcc在预处理结束后停止编译;
#"test.i":预处理后输出的文件;
#-o:指定输出文件;
gcc -E test.c -o test.i
2 编译
将预处理后的代码编译成汇编代码。检查代码的规范行、是否有语法错误,然后把代码翻译成汇编语言。
编译程序执行时,先分析,后综合。分析:词法分析、语法分析、语义分析和中间代码生成。
#-S:gcc在编译结束后停止编译过程;
#test.c:编译后生成的汇编代码
gcc -S test.i -o test.s
3 汇编
把编译阶段生成的".s"文件转成二进制目标代码,也就是机器代码(01序列)。
#-c:gcc在汇编结束后停止编译过程;
#test.o:汇编后生成的机器码目标文件;
gcc -c test.s -o test.o
4 链接
将多个目标文件以及所需的库文件链接生成可执行目标文件的过程。
#-o:本质上是一个重命名选项。不适用-o选项时,默认生成a.out文件;
gcc test.o -o test