在平时gcc编译中,通常的一步编译操作为:
gcc b.c -o b
在使用gcc编译的过程中,那么这个文件编译过程到底是什么?
上述gcc命令其实依次执行了四步操作:
1.预处理(Preprocessing),
2.编译(Compilation),
3.汇编(Assemble),
4.链接(Linking)。
一、预处理阶段
在该阶段,会将b.h文件(头文件)中的宏定义、引用和文件中的符号定义替换为真正的内容。预处理之后得到的仍然是文本文件,但文件体积会大很多。这是因为预处理中做了一些符号替换操作。
注:预处理阶段不检查语法
比如,在b.c头文件中引用了a.cpp/a.c,那么在预处理阶段,会将a.cpp/a.c中的符号加载到b.c中,这样才会在b.c中合理使用。
该阶段生成 .i 后缀文件
gcc -E b.c -o b.i
二、编译阶段
该阶段是将经过预处理之后的程序转换成特定汇编代码的过程,该步会检查语法,通常编程报错就是在该阶段。
该阶段生成 .s后缀文件
gcc -S b.i -o b.s
三、汇编阶段
汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。
该阶段生成 .o文件
gcc -c b.s -o b.o
四、链接阶段
链接过程将多个目标文件以及所需的库文件(.so等)链接成最终的可执行文件。需要启动代码、库代码等。
gcc b.o -o b
在该过程可以使用ldd b来查询需要哪些动态库。(Windows中运行程序中的.dll文件,就是所需要的动态库)
参数详解: