静态图书馆以及我们为什么需要它们

到底什么是静态库? 他们为什么很棒!

C编译器为我们提供的工具之一是静态库。 让我们先弄清楚什么是编译器库,然后再研究静态库。 库是一个包含许多目标(程序功能)文件的文件,可以在程序员正在编写的程序中调用这些目标文件并加以利用,并打算将其编译为可执行文件。

静态库只是在编译的链接阶段链接到程序中的目标文件的集合,这些目标文件(函数)从静态库中提取并打包在已编译程序的可执行文件中。

如何创建静态库

C程序员将名为'ar'的程序用于“存档”。 该程序可用于创建静态库,修改静态库中的目标文件,列出库中目标文件的名称,等等。 为了创建一个静态库,我们可以使用如下命令:

ar rc holberton.a one_file.o betty_net.o alotOf_math.o

该命令在执行时会创建一个名为“ holberton.a”的静态库,然后在其中放置目标文件的副本(请参见上文)“ one_file.o”,“ betty_net.o”和“ alotOf_math.o”。 如果某些库文件已经存在,则如果缺少的对象文件比库中已列出的对象文件新,则添加或替换这些对象文件。

'c'标志告诉ar创建库(如果尚不存在)。

'r'标志告诉它用新的目标文件替换库中较旧的目标文件。

创建或修改档案后,需要对其进行索引。 以后,编译器将使用此索引来加快库中符号的查找速度,并确保在编译期间库中符号的顺序无关紧要(当我们深入研究时,会更好地理解这一点。本教程结尾的链接过程)。 用于创建或更新索引的命令称为'ranlib' ,其调用方式如下:

ranlib libutil.a

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

  1. 使用'ranlib'重新生成索引。
  2. 将存档文件复制到另一个位置时,请使用'cp -p'而不是'cp''-p'标志告诉'cp'保留文件的所有属性,包括文件的访问权限,所有者(如果超级用户调用了“ cp”)及其最后修改日期。 这将导致编译器认为文件内的索引仍在更新。 此方法对于由于某种原因需要将库复制到另一个目录的makefile有用。

使用静态库

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

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

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