静态库

语言:C

什么是图书馆

库是包含多个目标文件的文件,可以在程序的链接阶段用作单个实体。

什么是“静态库”

静态库只是在编译的链接阶段链接到程序中的目标文件的集合,而在运行时则不相关。 最后一条注释似乎很明显,因为我们已经知道,目标文件也仅在链接阶段使用,而在运行时不需要使用-只有程序的可执行文件才能运行程序。

为什么要使用图书馆

已开发程序的问题之一是,它们倾向于变得越来越大,导致整体编译并将链接时间链接到一个很大的数字,并污染了makefile和我们放置源文件的目录。 通常,当我们寻找一种不同的方式来管理项目时,我们编写的程序第一次达到这种状态。

在这一点上,我们开始考虑将源代码组合到相关文件的小单元中,这些文件可以用单独的makefile进行管理,可能由不同的程序员(对于多程序员项目)进行管理。

他们如何工作

静态库的工作方式是将您创建的所有目标文件都转换为一个文件。 如果您看一下帖子顶部的图片,您会在后面看到井井有条的书架,而在前面则随意地放了一些书。 这就像拥有静态库为您的程序所做的一样。 随着,它看起来像背面。 没有,看起来像前面。

此外,您还可以对该库建立索引,以使编译器更轻松地将所有内容组合在一起。 在下一节中,我们将介绍如何对它们进行实际索引,但再次将其像图片一样:没有索引的库看起来像图片的前面,对象文件是随机放置的,没有顺序。 通过建立索引,您可以轻松搜索该库,从而减少程序开销。

如何创建静态库

为了创建静态库,我们需要使用一个名为“ ar”的工具来表示“存档器”。 通过使用“ ar”,我们从目录中的所有目标文件创建库。 运行此命令是:

ar rc libnameoflibrary.a object_file1.o object_file2.o object_file3.o

“ r”标志告诉ar将库中的旧目标文件替换为新的目标文件,而“ c”标志告诉ar创建库(如果尚不存在)。

接下来,您具有要调用库的名称,名称以“ lib”(库为lib)开头,以“ .a”(对于归档为.a)结尾。 该行的其余部分只是要包含在库中的所有对象文件的名称。 如果一次在同一目录中键入的内容过多,则可以使用* .o操作在当前目录中添加所有以.o结尾的文件(.o为目标文件)。

如何索引图书馆

为库建立索引非常简单,您可以采用以下两种方法之一(至少在C语言中)。 第一种方法是使用“ ar”命令时,在“ rc”之后添加修饰符-s。 因此,命令如下所示:

ar rc -s libnameoflibrary.a object_file1.o object_file2.o object_file3.o

另一种选择是使用ranlib:

ranlib libutil.a

很容易。 之所以有两个命令而不是一个命令,是因为在某些系统上,归档器负责创建索引。 但是有时它不会,因此您需要使用ranlib。 现在,让我们讨论如何使用它们。

如何使用

创建存档并将其编入索引后,我们想在程序中使用它。 这是通过使用特殊标志(通常为'-l'将库名添加到提供给链接器的目标文件名列表中来完成的。 这是一个例子:

cc main.o -L. -lutil -o prog

这将使用目标文件“ main.o”以及“ util”静态库中所需的任何符号创建一个程序。 请注意,在链接命令中提及库时,我们省略了“ lib”前缀和“ .a”后缀。 链接器将这些部分附加回库的名称,以创建要查找的文件的名称。 还要注意'-L'标志的用法–该标志告诉链接器,除了在编译器查找系统的标准位置之外,还可以在给定目录(“。”,指的是当前目录)中找到库。库。

静态库就这些了,请随时关注文档中的链接以获取有关其各自主题的更多信息。