gcc的编译过程
1.预处理:解释源程序当中的所有的预处理指令,将文件包含语句所指定的文件拷贝进来(#include <xxx.h>)覆盖掉原来的#include语句,所有的宏定义被展开(因此宏展开是不占用运行时间的),所有的条件编译语句将被执行,删除注释,添加必要的调试信息
获取C源程序经过预处理之后的文件,方法: gcc xx.c -o xx.i -E
2.编译:将预处理生成的.i文件编译为对应硬件平台的汇编语言(使用GCC,将生成x86格式的汇编文件)
获取C源程序经过预处理和编译之后的汇编程序,方法如下:
gcc xx.i -o xx.s -S
3.汇编:编译器gcc将会调用汇编器as将汇编源程序翻译成为可重定位文件
获取相应文件方法如下:gcc xx.s -o xx.o -c
4.链接:经过汇编之后的可重定位文件不能直接运行,链接是链接系统的标准C库、gcc内置库等基本库文件。因为Linux下任何一个程序编译都需要用到这些基本库的全局符号,因此以下命令-lc和-lgcc是默认的,可以省略:gcc xx.c -o xx -lc -lgcc
注:可以链接多个可重定位文件
GCC编译常用选项:
参数 | 功能 |
---|---|
-o | 指定输出文件名 |
-E | 输出预处理后的代码文件 |
-S | 输出编译后的汇编代码文件 |
-c | 输出链接后的可重定位文件 |
-g | 在编译结果中加入调试信息 |
-I | 指定头文件路径 |
-L | 指定库文件路径 |
-static | 使用静态链接 |
-Wall | 打开所有的警告 |