一本书的力量,或如何在C语言中使用静态库。

这是本系列的第二篇文章,以C语言为例,介绍什么是编译过程及其工作方式。

  1. 使用GNU编译器集合创建新世界
  2. 一本书的力量,或如何在C中使用静态库 。 (本文)
  3. C语言中的动态库 :在其他人依赖的东西上创建东西。

***

计算机程序的问题之一是,它们倾向于变得越来越大,给它的创建者尤其是维护者带来了更多挑战,并且增加了编译链接的时间 (如果您需要刷新有关这些主题的知识,请阅读系列的第一篇文章)。

解决此问题的方法是将源代码组合到相关文件的小单元中,可以轻松地对其进行管理。 这就是图书馆概念正在变得有用的地方。

是包含多个目标文件的文件,可以在程序的链接阶段用作单个实体。 通常,该库已建立索引,因此很容易在其中找到符号(函数,变量等)。 因此,链接目标文件在库中排序的程序比链接目标文件在磁盘上分开的程序快。 此外,使用库时,要查找和打开的文件更少,这甚至进一步加快了链接速度。

Unix系统(以及大多数其他现代系统)使我们可以创建和使用两种库- 静态库和共享(或动态)库。 在本文中,我们将更多地讨论静态对象。

静态库如何工作?

静态库只是在编译的链接阶段链接到程序中的目标文件的集合,而在运行时则不相关。 这是因为目标文件也仅在链接阶段使用,而在运行时期间则不需要-只有程序的可执行文件才能运行程序。

用于创建静态库的基本工具是一个名为ar (archiver)的程序。 该程序可用于创建静态库(也称为存档文件 ),修改静态库中的目标文件,列出库中目标文件的名称等。

如何创建静态库?

为了创建静态库,我们必须执行两个步骤:

  1. 从项目的源文件创建目标文件
  2. 从目标文件创建静态库(存档文件)

假设我们有一个项目,该项目从C标准库中重新创建了一些常用功能:

现在,让我们使用gcc -c *.c命令创建目标文件:

现在,我们可以使用ar -rc命令创建库(将其称为libtools ):

 ar -rc libtools.a -o *.o 

此命令将创建一个名为libtools.a的静态库,并将所有目标文件的副本放入其中。 如果库文件已经存在,则将添加或替换目标文件(如果它们比库中的文件新)。 关于这些标志: c标志告诉ar创建库(如果尚不存在)。 -r标志告诉它用新的目标文件替换库中较旧的目标文件。

创建或修改档案后,我们需要为其建立索引。 以后,编译器将使用此索引来加速库中的符号查找。 用于创建或更新索引的命令称为ranlib ,其调用方式如下:

  ranlib libtools.a 

在某些系统上,归档器(并不总是ar )已经处理了索引,因此不需要ranlib (例如,当Sun的C编译器创建归档时,已经对其进行了索引)。 但是,由于arranlib被许多软件包的许多makefile使用,因此此类平台倾向于提供不对档案进行索引的ranlib命令。 这有助于在两种类型的平台上使用相同的makefile。

如何使用静态库?

这里有一个在编译过程中如何使用静态库的示例:

  gcc -o result_program our_sources.c -L-l工具 

在这种情况下,我们使用了gcc编译器,并要求其将结果(key -o )作为our_sources.c源文件中的our_sources.c输出,并使用当前目录中的库(名为libtool.a key -L后的点.. libtool.a (键-l )。 请注意,我们仅使用了名称tool没有前缀lib和扩展名.a 。 它们将由编译器自动解决。

让我们编译程序并运行它:

就是这样,伙计们!

摘要:

在本文中,我们研究了诸如静态库之类的概念存在的原因,它们如何工作,如何创建以及如何使用它们。