使用 GNU 软件编程

作者:Randyl Britten
  • 作者:Mike Loukides 和 Andy Orem

  • 出版社:O'Reilly & Associates, 1997

  • 页数:260

  • ISBN:1-56592-112-7

  • 价格:$39.95;包含 CD-ROM

  • 评论者:Randyl Britten

Linux 构建于双重支柱之上。我们通常与 Linux 关联的一个支柱是由 Linus Torvalds 开发的内核。另一个支柱,我们经常认为理所当然的,是构成自由软件基金会 (FSF) 便携式软件开发系统的 GNU 工具集。《使用 GNU 软件编程》是对这些工具以及如何使用它们的简明但非常实用的介绍。涵盖的工具包括 Emacs、C 和 C++ 编译器 gcc 和 g++、gdb 调试器、make 实用程序、RCS 版本控制系统和 gprof,一个用于分析和定时程序的实用程序。CD-ROM 包含这些工具的源代码以及为几个流行的 Unix 系统(如 SunOS 和 Solaris for SPARC、HP-UX for HP9000、AIX for RS/6000、Irix for Indigo 和 DEC Unix for Alpha)编译的二进制文件。

这本书和 CD-ROM 的组合并非专门为 Linux 用户设计,但对于任何为 Unix 或 Linux 开发软件的人来说,这都是一本重要的书。这本书在一年多前的 O'Reilly 目录中被描述为“即将出版”,从那时起我就一直在热切等待它。如果您拥有 Linux 的最新发行版,您可能已经拥有此处讨论的大部分或全部工具。即便如此,本书中的几乎所有内容以及 CD-ROM 上的许多源代码对于 Linux 初学者和专家都可能有用。一个重要的额外好处是讨论了针对各种平台的交叉编译和交叉开发。如果您对便携式软件或移植应用程序、嵌入式系统或者只是对 GNU 工具的良好介绍感兴趣,那么这本书是一个不错的起点。

CD-ROM 上的库不是受 LGPL(库通用公共许可证)管辖的 FSF 版本。这些库是 Cygnus Support 的重写版本,该公司为商业用途(尤其是在嵌入式系统中)移植和支持自由软件。使用 Cygnus 库避免了 LGPL 对于商业嵌入式系统更不切实际的限制,Cygnus 仅要求您承认使用了他们的软件。例如,如果您发明了世界上最棒的拿铁咖啡机/百吉饼加热器,并在控制器中使用 FSF 库,则您必须公开源代码,或者为您的客户提供在发布新版本时升级库的方法。如果您对法律问题有任何疑问,您应该联系 Cygnus Support。请访问他们的网站 http://www.cygnus.com/。

使用 GNU 工具

在第 1 章中介绍了自由软件哲学并进行了讨论之后,第 2 章简要介绍了 Unix 及其用于软件开发的传统工具的使用。然后第 3 章深入探讨了使用 Emacs 的 GNU 软件的核心。如果您一直对 Emacs 的庞大规模感到畏惧,您应该会发现本章是入门的简单方法。

本书的覆盖范围不仅仅是入门级的,而且在关键的地方也具有深度。即使我已经使用 Emacs 多年,我还是在本章中学到了一些新技巧。例如,我喜欢在我的 C 程序中使用原始的 Kernighan & Ritchie 缩进风格,每次按下 TAB 键缩进四个空格。使用书中的一个示例,我能够在我的主目录中的默认初始化文件 .emacsrc 中添加一个自定义项。现在,每当我编辑以 .c、.cpp 或 .h 结尾的文件时,Emacs 将自动进入 C 模式,并且当我在行首按下 TAB 键时,将正确缩进我的程序。它的大部分功能和所有自定义项都是用 Emacs Lisp 编写的。Emacs 本身主要是这种语言及其许多扩展的解释器。本书还介绍了如何从 Emacs 中运行编译器,这样您就可以在后台编译继续进行的同时继续编辑。

GNU 软件工具是集成的,并以各种方式协同工作,而 Emacs 是其核心。以下是我从书中收集到的一些学习和使用 Emacs 的额外动力

  1. bash—默认的 Linux shell—使用 Emacs 命令进行基本的命令行和历史编辑。

  2. info—通常比 man pages 更有用的命令—是一个类似 Emacs 的超文本应用程序,它使用一组特殊的命令进行基本导航,以及许多熟悉的 Emacs 命令。

  3. gdb—本身就是一个 shell—使用 Emacs 命令进行基本的命令行和历史编辑。

由于 Emacs、bash、gcc、GNU make、RCS 和 gdb 之间的互操作性,学习使用 Emacs 非常有意义。

使用 gcc 编译

第 4 章首先概述了编译过程,包括预处理器、翻译器/优化器、汇编器和链接器,以及许多其他参与软件开发过程的工具(例如库)。您可以使用许多编译器选项、优化级别和中间文件格式。与本书的其余部分一样,本章并不试图成为一个全面的参考。相反,它很好地讨论了最常用的命令和选项,并添加了即使是高级用户也会欣赏的技巧。本章结尾介绍了交叉编译器,以及在交叉开发环境中构建自己的库的要求。书中包含一个表格,概述了 Cygnus 库支持的大量主机和目标系统,以及可以生成的输出格式,如 a.out、COFF 和 ELF。

第 5 章继续详细介绍了 C 和 C++ 库的使用,以及支持 Unix 或类 Posix 系统的系统接口所需的内容。因此,如果您有兴趣将 Linux 移植到最新的 64 位 PDA 或您阿姨刚打折购买的新 WebTV,那么这里是了解所需知识的地方。请记住,这两章不是关于 C 或 C++ 语言或如何编写程序。许多其他书籍作为学习辅助工具更有用(请参阅“资源”侧边栏)。第 5 章结尾简要讨论了库许可问题。

使用 gdb 调试

GNU 调试工具 gdb 是一个交互式 shell,它有自己的命令、历史记录(以前执行的命令)和编辑器(当然,类似 Emacs)。基本思想是您可以控制和检查正在执行的进程的内部工作,并与其源代码和变量进行交互。这里对 gdb 的介绍非常广泛,我没有在任何其他参考资料中看到对 gdb 的良好教程介绍。仅此介绍就可能值回书价。

使用 make 构建程序

make 实用程序用于从多个源文件构建程序,并且仅编译需要更新的文件,基于每个文件的日期戳和依赖关系。编写简单的依赖关系非常容易,这样,例如,如果包含文件被更改,则仅重新编译使用它的文件;自动化这些步骤可以节省构建新的可执行程序的时间。make 实用程序已经存在很长时间,并且变得非常复杂,而 GNU make 是最全面的之一。第 7 章的介绍很简短,但它是一个出色的教程介绍,涵盖了基本和高级功能。有关更深入的介绍,请参阅 O'Reilly 关于 make 的书。

使用 RCS 管理源代码

RCS 版本控制系统是一个用于管理程序随时间演变的版本的工具。GNU make 知道 RCS,并且可以自动使用当前版本。同样,介绍很简短,但提供了足够的入门知识供您开始使用它们;更多详细信息可在 O'Reilly 和 FSF 的其他著作中找到。

使用 gprof 进行性能分析

有两个工具可以用于定时和分析您的程序:timegproftime 命令内置于 bash shell 中,类似于其他 shell 中的 timex 命令。它只是给出了程序作为一个整体的已用执行时间,按用户和系统分解,并提供了一些额外的系统详细信息。gprof 工具是一个报告生成器,可以提供有关程序将时间花费在哪里的详细信息。gprof 实用程序可以提供一维配置文件或二维核算,后者跟踪程序的调用图。调用main() 函数开始,并为调用的每个函数提供执行细分,包括花费的时间和函数被调用的次数。它甚至可以处理递归程序。学习使用 gprof 是提高程序性能的最佳方法。对这个重要工具的介绍在其他地方不容易获得,这也是本书成为宝贵资源的另一个原因。

结论

这本书特别好的地方在于它结合了出色的教程风格,使您易于上手,以及深入探讨每个主题的重要主题。即使您已经有使用 Unix 工具进行 C/C++ 编程的经验,您也会发现许多有用的技巧。本书只有大约 250 页,内容简明扼要,我可能希望的是更完整的参考资料。为此,我们将不得不求助于其他地方,例如 info 页面和下面列出的参考资料。我确信这本书在一段时间内对我来说将是一本宝贵的参考书。作者 Mike Loukides 和 Andy Orem 是 O'Reilly 的高级技术编辑,他们做得非常出色,远高于软件文档的平均水平。

资源

Programming with GNU Software
Randyl Britten 是西雅图的一名软件开发人员,拥有华盛顿大学计算机科学硕士学位。自从 LJ 发行第一期以来,他就一直在摆弄 Linux。他还通过网络在 UW Extension 教授 C 编程。您可以在 http://weber.u.washington.edu/~instudy 找到更多信息,或发送电子邮件至 britten@u.washington.edu。
加载 Disqus 评论