在C中使用静态库

因此,您已经找到了如何用C编写程序和函数。下一步的逻辑就是将这些函数放在一起,对吗? 好吧,如果您现在就尝试这样做,那么您将花费无数的时间为闪亮的新项目编写和重写函数。

图书馆是从哪里来的。

库是一个文件,在一个方便的小程序包中包含项目功能的目标文件版本。 而不是这样做:

您可以轻松地创建一个库,以缩短编译过程中链接文件所需的时间,并减少您键入的字符数-这意味着您不太可能犯错误,而不必在命令中进行搜索,或更糟糕的是,必须重新重写整个过程。

虽然C有两种不同类型的库(静态库和动态库/共享库),但本文将探讨这两种库之一-静态库。

“但是头文件就足够了!”您说。 “我可以在标头中引用我的所有函数,然后从那里链接!”

但是,如果您的程序具有五十,一百, 数百个功能,会发生什么情况?

图书馆。

在拥有数百个文件的地方,现在只有一个(或可能是两个或三个)库。

库非常容易创建。 主要步骤是编译,归档和索引,然后是程序的最终编译。

汇编,pt 1

为了创建函数库,首先我们需要一个充满它们的文件夹。

  jack @ ubuntu:〜/ 0x08-static_libraries $ ls * .c 
0-isupper.c 0-strcat.c 1-isdigit.c 1-strncat.c 2-strlen.c 3-islower.c 3-strcmp.c 4-isalpha.c 5-strstr.c 9-strcpy.c _putchar.c
0-存储器组100-中心1-存储器1 2-存储器2-存储器3 2-计算机3-存储器3-存储器4-存储器6

然后,我们使用-c标志运行gcc。

  gcc -c * .c 

您会注意到gcc输出的文件具有扩展名.o,它表示对象或机器代码文件。 这些是我们创建库所需的文件。 尽管您可以在编译中包含单个目标文件,但我们正在查看的文件夹中包含大量这些文件,因此创建包含这些功能的库会容易得多。

存档

ar(或“ archive”)命令是我们用来创建库的命令。 通过使用标志-r和-c,我们告诉存档器将库中的任何旧对象文件替换为它们的较新版本,并创建该库(如果不存在)。

  ar -rc libmylib.a * .o 

为了使事情更快(并且更不容易出错),您可以使用* .o来收集当前目录中的所有.o文件。

索引编制

索引组织一个库来完成两件事:加速符号查找,并确保符号顺序不会影响编译。 我们可以使用ar命令的-s标志,或使用ranlib命令来为我们的档案建立索引。

  ar -s libmylib.aranlib libmylib.a 

编译点 2

要在程序中使用我们的库,我们只需要使用gcc将其包含在最终编译中即可。

  gcc main.c -L。  lmylib 

-L标志告诉gcc查找目录-在这里,我们已使用’。’表示当前工作目录。

您会注意到文件名的格式很奇怪。 当您使用“ l”后跟库名,并删除前缀“ lib”和扩展名“ .a”时,gcc将在搜索时自动将删除的部分重新添加回去。 重要的是要注意,动态库优先于静态库,因此,如果您有一个与静态库同名的动态库,则动态库将是其中的文件。

现在,在控制台的标准输入中键入nm libmylib.a您显示库中的内容。 ar -t libmylib.a还将显示相同的文件。

我希望您对C语言中的静态库有所了解,以及为什么它们是成为任何程序员的必备工具。