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 下面,看看其工作流程. 流程图如下:

1

预处理,将包含的 .h 文件或者一些预处理语句(如 #define)处理一下,然后将 .c 文件生成 *.i 的中间文件.

注意了 GCC 不会自动生成这样一个文件,如果需要,自己加 -E 参数即可.

编译、汇编阶段生成 *.o 目标文件,最后经过链接生成可执行文件.

注意:可执行文件不一定是 exe 文件.

实例

下面以一个实例 hello.c,说明这个过程.

1

源文件很简单,这里只是为了说明问题.

在命令行,执行下面命令完成预处理:

1
gcc -E hello.c -o hello.i

执行之后,你可以打开 hello.i 文件,可以看到很多 extern 以及将 MAX 解释为 20:
1

在命令行,执行下面命令, 完成编译阶段:

1
gcc -S hello.i -o hello.s

这时可以生成 *.s 文件,其实就是一些汇编语句,如下所示:
1

那麽,我们就可以进入汇编阶段了,执行:

1
gcc -c hello.s -o hello.o

打开这个 hello.o 文件,都是一些机器码.

最后一个连接生成可执行文件:

1
gcc hello.o -o hello

在当前目录就可以生成 hello 这个可执行文件.

执行 ./hello,就会输出:
1

到此,GCC 编译连接生成可执行文件完毕!

当前目录下面的文件:
1

以上的步骤,其实一句命令即可:

1
gcc hello.c -o hello

此时目录内容如下:
1

自己动手感受一下,你会收获更多!

GCC 系列博文

GCC: 编译 C 语言的流程

GCC: Homebrew 安装 GCC 和 Binutils

GCC: 共享库

GCC: 静态库

坚持原创技术分享!