1. 介绍

这篇面向程序员的 HOWTO 讨论了如何使用 GNU 工具集在 Linux 上创建和使用程序库。“程序库”只是一个包含编译代码(和数据)的文件,该文件稍后将被合并到程序中;程序库使程序更模块化、更快地重新编译且更易于更新。程序库可以分为三种类型:静态库、共享库和动态加载 (DL) 库。

本文首先讨论静态库,它在程序运行之前被安装到程序可执行文件中。然后讨论共享库,它在程序启动时加载并在程序之间共享。最后,讨论动态加载 (DL) 库,它可以在程序运行时随时加载和使用。DL 库实际上并不是一种不同的库格式(静态库和共享库都可以用作 DL 库);相反,区别在于程序员如何使用 DL 库。本 HOWTO 最后一部分包含更多示例,另一部分包含对其他信息来源的引用。

大多数开发库的开发人员应该创建共享库,因为这允许用户将库与使用这些库的应用程序分开更新。动态加载 (DL) 库很有用,但它们需要更多的工作才能使用,并且许多程序不需要它们提供的灵活性。相反,静态库使升级库变得更加麻烦,因此对于通用用途,很难推荐它们。尽管如此,每种库都有其优点,并且每种类型的优点都在讨论该类型的章节中描述。使用 C++ 和动态加载 (DL) 库的开发人员还应查阅“C++ dlopen mini-HOWTO”。

值得注意的是,有些人使用术语动态链接库 (DLL) 来指代共享库,有些人使用术语 DLL 来表示用作 DL 库的任何库,还有些人使用术语 DLL 来表示满足任一条件的库。无论您选择哪个含义,本 HOWTO 都涵盖了 Linux 上的 DLL。

本 HOWTO 仅讨论可执行文件和库的可执行文件和链接格式 (ELF) 格式,这是当今几乎所有 Linux 发行版使用的格式。GNU gcc 工具集实际上可以处理 ELF 以外的库格式;特别是,大多数 Linux 发行版仍然可以使用过时的 a.out 格式。但是,这些格式不在本文的范围之内。

如果您正在构建一个应移植到多个系统的应用程序,您可以考虑使用 GNU libtool 来构建和安装库,而不是直接使用 Linux 工具。GNU libtool 是一个通用的库支持脚本,它将使用共享库(例如,创建和安装它们)的复杂性隐藏在一个一致的、可移植的界面之后。在 Linux 上,GNU libtool 构建于本 HOWTO 中描述的工具和约定之上。对于动态加载库的可移植接口,您可以使用各种可移植性包装器。GNU libtool 包含这样一个包装器,称为“libltdl”。或者,您可以使用 glib 库(不要与 glibc 混淆),它对模块的动态加载提供可移植支持。您可以在 http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html 了解有关 glib 的更多信息。同样,在 Linux 上,此功能是使用本 HOWTO 中描述的构造实现的。如果您实际上是在 Linux 上开发或调试代码,您可能仍然需要本 HOWTO 中的信息。

本 HOWTO 的主位置是 http://www.dwheeler.com/program-library,它已贡献给 Linux 文档项目 (http://www.linuxdoc.org)。它在 2000 年由 David A. Wheeler 拥有版权 (C),并通过通用公共许可证 (GPL) 获得许可;有关更多信息,请参阅最后一节。