还是 2015 年学过的知识,这么久不用忘差不多了。本文主要记录一下方便以后查阅并加深印象。gcc 编译一个程序的四个过程分别是 预处理->汇编->编译->链接,预处理一般是导入一些头文件的信息及一些宏的替换等等,汇编是将代码编译为汇编代码,真正到编译过程才是把汇编代码编译为二进制的文件,最后链接是链接一些函数所需的库文件。以下是分布执行对应步骤的命令。
预处理 -E
1 | gcc -E main.c -o main.i |
使用 -E 命令对代码做预处理以后,代码所包含的头文件和一些宏就已经被替换到源代码中了,vim 看一下预处理后的 mian.i,就是如下状态。
1 | .................... |
我们可以看到已经有 800 多行代码了,实际是 #include 包含的一些文件的信息也导入了进来。
汇编 -S
汇编的过程是将预处理后的代码转换为汇编代码。
1 | gcc -S main.i -o main.s |
使用 -S 参数后,代码就被转换为汇编代码了。如下所示:
1 | 1 .file "main.c" |
编译 -c
编译的过程是将汇编后的代码转换为二进制的代码。
1 | gcc -c main.s -o main.o |
这个时候 main.o 里面的内容就已经是纯二进制的结构了,再用 vim 看就没什么意义了,只能看到一堆乱码。
链接
最后一步就是将已经编译好的二进制文件链接对应的库,比如我们用到了 printf 函数,那该函数的实现在哪个库里面我们就要去链接,否则程序是无法运行的。
1 | gcc main.o -o main |
链接后最终生成的就是可执行文件了。以上就是使用 gcc 编译一个源文件的整体过程。