0:前言

大部分学c语言的人都应该知道c语言中,鼎鼎大名的编译器——GCC。

我们看看百度百科对他的介绍。

GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)。
GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。

想对它有个初步了解的,可以戳这里:

G~C~C

gcc​baike.baidu.com/item/gcc/17570

那么神奇的gcc到底是如何将c语言编译成可执行文件,并在终端运行的呢?


1:预处理

我们在写c语言文件的时候,大多会写某些比如#include之类的前面有井字号的命令。这些命令叫做预处理命令。类似的还有#define等等。

我们还会在编写c语言文档的时候加入一些注释。

编译器都会在这个阶段将其预处理掉。这一步,生成的是文本。

比如之前说的预处理命令#include,引入命令,想要看它是如何作用的,可以看这篇文章:

要想要看看游戏脚本产生的预处理文件是什么样的,需要在终端输入这个命令:(将test换成要测试的文件)gcc -E test.c -o test.i

这就是gcc工作的第一步。

  • 预处理(Pre-Processing):对 C 语言进行预处理,生成 test.i 文件

2:编译

在这一步,gcc会读取之前生成的以i为后缀名的文件,并将其编译成汇编文件。这一部生成的是文本,too。

使用下面这个命令编译,要求同上。gcc -S test.i -o test.s

以上是gcc编译的第二步。

  • 编译(Compiling)– 将上一步生成的 test.i 文件编译生成汇编语言文件,后缀名为 test.s

3:汇编

这一步的过程,和上一部类似,只不过是将汇编文件编译成可执行文件而已。

使用如下和以上要求相同的命令:gcc -O test.s -o test.o

不过要注意的是,这一步生成的东西不是文本了,不能用vim等编译器打开了。

如果你是linux用户,建议用xxd命令打开。


4:链接

这是将库函数与文件连接的过程,这个过程非常复杂,可以看做是文件中需要的部分,被编译之后套上本文件。


这就是gcc编译的四个部分:

  • 预处理(Pre-Processing)– 对 C 语言进行预处理,生成 test.i 文件
  • 编译(Compiling)– 将上一步生成的 test.i 文件编译生成汇编语言文件,后缀名为 test.s
  • 汇编(Assembling)– 将汇编语言文件 test.s 经过汇编,生成目标文件,后缀名为 test.o
  • 链接(Linking)– 将各个模块的 test.o 文件链接起来,生成最终的可执行文件。

记得别忘了./a.out噢。


5:附录

这篇文章讲得挺好的,放个。

计算机是如何识别并运行C程序的?www.zhihu.com/question/596013056/answer/2988418597?utm_psn=1717973957767012352


了解 云端轨迹 – 张小云的个人主页 的更多信息

订阅后即可通过电子邮件收到最新文章。

留下评论

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

最新日志

Quote

“我?请问别人。”

“这个WORDPRESS.COM真的好慢!”

~ 张小云

友情链接

sujunhere.top

又是一个代码重任…

可爱的访问量:
Web Analytics

Designed with WordPress