|
|||||||||||||||||||
|
|||||||||||||||||||
| 目录 前言 | |||||||||||||||||||
|
GCC 编译程序的历史很有趣,远远不止是一个时间和事件的列表。这个软件对于整个自由软件运动而言具有根本性的意义。事实上,如果没有它或类似的软件,就不可能有自由软件运动。 GCC 为 Linux 的出现提供了可能性。 本章概要介绍了 GCC 编译程序集合,以及它的相关工具。这些编译中使用的工具可以跟踪源代码、编辑文件、控制编译过程、提供调试信息。 本章介绍的内容包括一个列表以及对处理过程的一些描述。该列表描述了组成编译程序集合的文件和程序。之后介绍了将源文件变成可连接和可执行程序的步骤。 1.1 GNUGCC 是 GNU 项目的一个产品。该项目始于 1984 年,目标是以自由软件的形式开发一个完整的类 UNIX 的操作系统。像所有这种规模的软件一样, GNU 项目也经历了一些波折,但目标最终还是实现了。实际上现在一个功能完备的类 UNIX 操作系统—— Linux ,已经在世界上广为流传了,并被不计其数的公司、政府和个人成功应用。而该系统及其所有工具和应用都是基于 GCC 的。 可用于 Linux 以及其他系统的自由软件的范围很广泛,并且还在日益增长。作为整体 GNU 项目的一部分而开发的免费 UNIX 被列在 http://www.gnu.org/directory 中的自由软件目录( Free Software Directory )中。 成千上万的程序员都在为各种 GNU 项目(及其他自由软件项目)作贡献,而实际上所有这些都在某种程度上依赖于 GCC 。
1.2 测量编译程序我们可以在编译的速度、生成代码的速度,以及生成代码的尺寸上对编译程序进行比较。但是很难进行更深入的比较,因为虽然可以得出一些数字,却很难对这些数字赋予某种实际意义。例如,源文件的数目( make 程序的描述文件、配置文件、头文件、可执行代码,等等)显示共有超过 15 000 个的各种文件。源文件编译成的目标文件、库和可执行程序的数目成千增长。代码的行数(这 15 000 多个文件的行数)超过 3 700 000 。从任何标准来看,这都是一个大程序。 代码的质量参差不齐——因为有如此之多的程序员参与开发过程,而且代码注释中也内嵌了大量的内部文档,所以文档的质量和数量也有变化。所幸的是,有大量的程序员正在努力地提高代码和注释的质量。而且,也不是必须阅读内嵌的注释才能使用编译程序。但如果要对编译程序做些工作,你会发现还是要花些时间阅读代码中内嵌的注释。 测量编译程序的质量的惟一方法是询问它的用户。全世界的用户数目很难估计(自由软件就有这样的特性),但一定是巨大的。它被用于某些版本的 UNIX ,这些 UNIX 自带系统供应商提供的本地编译程序。事实上,我知道一个很大的 UNIX 供应商就在自己内部的项目中使用 GCC ,即便该供应商也有自己的很优秀的编译程序。 GCC 编译程序从未停止过改进。如同第 2 章所描述的,通过下载某个特定版本的源代码便可安装已经发布的某个版本的 GCC ,也可以直接下载最新的(或测试中的)版本。测试中的版本时刻都在改进。有些更正是修改已有的 bug ,还有一些是为了加入新的语言和功能,还有一些是为了去掉某些不再应用的功能。如果你曾经使用过 GCC ,隔一段时间再用最新版,一定会发现一些变化。 1.3 命令行选项每个命令行选项都以一个或一对连字号开始。例如,下面的命令行会编译 ANSI 标准 C 程序 muxit.c ,再产生一个非连接的目标文件 muxit.o : gcc -ansi -c muxit.c -o muxit.o 这些单字母选项后面跟着的名字可以和字母之间留有空格。例如,选项 -omuxit.o 和 -o muxit.o 是一样的。 下面的命令用 -v 代表详细说明,而 --help 会打印可用的选项,而且会打印一个详细的包括所有命令行选项的列表,包括那些适用于特定语言的选项。 gcc -v --help 有可能构造一些实际不做任何事情的命令行。例如,下面的命令将目标文件交给编译程序,然后指定 -c 选项防止激活连接程序: gcc -c brookm.o 所有的命令行选项大致可分为三类: · 指定语言 GCC 编译程序有能力编译多种语言,有些选项只可用于其中的一两种。例如, -C89 选项只应用于 C 语言,指定适用于 1989 年的标准。 · 指定平台 GCC 编译程序可以为多种平台生成目标代码,而有些选项只能应用于为某个指定平台生成代码。例如,如果输出平台是 Intel 386 ,那么 -fp-ret-in-387 选项可用来指出要将函数调用返回的浮点数保存在硬件的浮点寄存器中。 · 普适 很多选项对所有语言和平台都适用。例如, -O 选项指示编译程序要优化输出代码。 使用编译程序不知道的选项总会产生出错消息。使用目标平台不适用的选项也会产生出错消息。 gcc 程序能够自己处理所有已知的选项,而将未知其他选项传递下去来编译指定语言。如果传递下去的选项对指定语言的处理器是未知的,就会报错。 选项可以指示 gcc 只执行特定的操作(例如连接或预处理)或什么都不做,这就是说有些标志没有什么特殊目的。除非用 -W 选项产生特殊警告,否则这些标志可被识别但不采取任何动作,只简单忽略而已。 |
|||||||||||||||||||
| 下一页 回专题首页 | |||||||||||||||||||