GCC: 编译C语言的流程
再看下文之前,先普及一下 Linux 和 gcc 的历史,下面的这段内容来自于网络。
早在 20 世纪 70 年代,UNIX 系统是开源而且免费的。但是在 1979 年时,AT&T 公司宣布了对 UNIX 系统的商业化计划,随之开源软件业转变成了版权式软件产业,源代码被当作商业机密,成为专利产品,人们再也不能自由地享受科技成果。
于是在 1984 年,Richard Stallman 面对于如此封闭的软件创作环境,发起了 GNU 源代码开放计划并制定了著名的 GPL 许可协议。
1987 年时,GNU 计划获得了一项重大突破—gcc编译器发布,这使得程序员可以基于该编译器编写出属于自己的开源软件。
随之,在 1991 年10 月,芬兰赫尔辛基大学的在校生 Linus Torvalds 编写了一款名为 Linux 的操作系统。该系统因其较高的代码质量且基于 GNU GPL 许可协议的开放源代码特性,迅速得到了 GNU 计划和一大批黑客程序员的支持。
随后 Linux 系统便进入了如火如荼的发展阶段。
1994 年 1 月,Bob Young 在 Linux 系统内核的基础之上,集成了众多的源代码和程序软件,发布了红帽系统并开始出售技术服务,这进一步推动了 Linux 系统的普及。
1998 年以后,随着 GNU 源代码开放计划和 Linux 系统的继续火热,以 IBM 和 Intel 为首的多家 IT 企业巨头开始大力推动开放源代码软件的发展。
到了 2017 年年底,Linux 内核已经发展到了 4.13 版本,并且 Linux 系统版本也有数百个之多,但它们依然都使用 Linus Torvalds 开发、维护的Linux 系统内核。RedHat 公司也成为了开源行业及 Linux 系统的带头公司。
声明
这篇博文 makefile: gcc 工作流程 早期被我放在 CSDN 上面过.时隔多年, 仍不能忘怀, 现乔迁至此.
本文比较简单, 比较适合初学者.
我只是试图以实例的方式给大家讲解一下 GCC 编译链接 C语言程序的流程, 并没有高深的知识.
编译流程
C 语言经过预处理、编译、连接最后生成可执行文件.
在 Linux 的 GCC 下面,看看其工作流程. 流程图如下:
预处理,将包含的 *.h 文件或者一些预处理语句(如 #define)处理一下,然后将 *.c 文件生成 *.i 的中间文件.
注意了 GCC 不会自动生成这样一个文件,如果需要,自己加 -E 参数即可.
编译、汇编阶段生成 *.o 目标文件,最后经过链接生成可执行文件.
注意:可执行文件不一定是 exe 文件.
实例
下面以一个实例 hello.c,说明这个过程.
源文件很简单,这里只是为了说明问题.
在命令行,执行下面命令完成预处理:
1 | gcc -E hello.c -o hello.i |
执行之后,你可以打开 hello.i 文件,可以看到很多 extern 以及将 MAX 解释为 20:
在命令行,执行下面命令, 完成编译阶段:
1 | gcc -S hello.i -o hello.s |
这时可以生成 *.s 文件,其实就是一些汇编语句,如下所示:
那麽,我们就可以进入汇编阶段了,执行:
1 | gcc -c hello.s -o hello.o |
打开这个 hello.o 文件,都是一些机器码.
最后一个连接生成可执行文件:
1 | gcc hello.o -o hello |
在当前目录就可以生成 hello 这个可执行文件.
执行 ./hello,就会输出:
到此,GCC 编译连接生成可执行文件完毕!
当前目录下面的文件:
以上的步骤,其实一句命令即可:
1 | gcc hello.c -o hello |
此时目录内容如下:
自己动手感受一下,你会收获更多!