编译流程:
1. 预处理
1. 完成宏替换、文件引入、以及去除空行、注释等,为下一步的编译做准备。
2. 对各种预处理命令进行处理,包含头文件的包含、宏定义的扩展、条件编译的选择等。
命令:`gcc -E test.c -o test.i `
-E是让gcc在预处理结束后停止编译,test.c为源代码文件,test.i为预处理后输出的文件
2. 编译
1. 讲预处理后的代码编译成汇编代码。在这个阶段主要检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,再把代码翻译成汇编语言
2. 编译程序执行时,先分析,后综合。分析,就是指词法分析、语法分析、语义分析和中间代码生成。综合,就是指代码优化和代码生成。
3. 大多数的编译程序直接产生机器语言的目标代码,形成可执行的目标文件,也有的是先产生汇编一级的符号代码文件,再调用汇编程序进行翻译和加工处理,最后产生可执行的机器语言目标文件。
命令:`gcc -S test.i -o test.s`
-S是让gcc在编译结束后停止编译过程,test.s文件为编译后生成的汇编代码。
3. 汇编
1. 汇编就是把编译阶段生成的.s文件转换成目标代码,也就是机器代码(01序列)
命令:`gcc -c test.s -o test.o`
-c让gcc在汇编结束后停止编译过程,test.o文件是汇编后生成的机器码目标文件。
4. 链接
1. 链接就是将多个目标文件以及所需的库文件链接生成可执行目标文件的过程
命令:`gcc test.o -o test`
-o本质上是一个重命名选线,不是用-o选项时,默认生成的是a.out文件。
5. 运行
命令:`./test`
上述步骤 一条命令 gcc -o test test.c 即可生成可执行的目标文件