2. 静态库

静态库仅仅是普通目标文件的集合;按照惯例,静态库以“.a”后缀结尾。这个集合是使用 ar (归档) 程序创建的。静态库不像以前那样经常使用,因为共享库(如下所述)具有优势。尽管如此,静态库有时仍然会被创建,它们在历史上首先出现,并且更容易解释。

静态库允许用户链接到程序,而无需重新编译其代码,从而节省了重新编译时间。请注意,考虑到当今更快的编译器,重新编译时间已不再那么重要,因此这个理由已不如以前那样有力。如果开发者希望允许程序员链接到他们的库,但不希望提供库源代码(这对库供应商来说是一个优势,但显然对试图使用库的程序员来说不是优势),那么静态库通常对开发者很有用。理论上,静态 ELF 库中链接到可执行文件中的代码应该比共享库或动态加载库运行得稍快(快 1-5%),但实际上,由于其他混杂因素,这种情况似乎很少发生。

要创建静态库,或将其他目标文件添加到现有静态库,请使用如下命令

ar rcs my_library.a file1.o file2.o

这个示例命令将目标文件 file1.o 和 file2.o 添加到静态库 my_library.a 中,如果 my_library.a 尚不存在,则创建它。有关创建静态库的更多信息,请参阅 ar(1)。

创建静态库后,您将需要使用它。您可以在创建程序可执行文件时,通过将其作为编译和链接过程的一部分来使用静态库。如果您使用 gcc(1) 生成可执行文件,您可以使用 -l 选项来指定库;有关更多信息,请参阅 info:gcc。

使用 gcc 时,请注意参数的顺序;-l 选项是一个链接器选项,因此需要放在要编译的文件名之后。这与正常的选项语法截然不同。如果您将 -l 选项放在文件名之前,则可能根本无法链接,并且您可能会遇到莫名其妙的错误。

您也可以直接使用链接器 ld(1),使用其 -l 和 -L 选项;但是,在大多数情况下,最好使用 gcc(1),因为 ld(1) 的接口更可能发生变化。