额外! 额外! — 阅读所有相关内容(获取它, 图书馆和阅读书 )
那么,什么是图书馆?
就C编程语言而言,一个库就像Ron Burgundy(如上图)一样会说:“ 我是很重要的,人们都知道我”。 通常,有形的现实世界图书馆由“ 许多皮革装订的书本和浓郁的红木香气”组成。 在这里, John Q. Public记录了丰富的知识和智慧(在纳尼亚或其他地方)并进行了归档 (非常重要,如您将在下面看到的),并根据认为合适的权限进行传播。
因此,在编程中,尤其是在C ,这就是为什么我们想要在编写程序时使用库,就像在有形的世界中一样,以利用已经发现,编写和共享的信息和知识。 目的是获取这些信息并将其添加到我们的知识库中,并将其提交给内存并最终加以使用; 而不必通过发现, 重新定义和/或偶然发现我们自己的知识而使我们的生活更轻松。 因此,我们所知道的静态库 。
静态库是编译器在编译过程中提供给我们的文件,在编译的链接阶段将其链接到我们的源代码C程序中。 它是一个单一文件,换句话说,是一个档案库-本质上是目标文件的集合,其中包含我们可以/将在C程序中调用的已定义函数(和/或函数原型)。
因此,由于它与使用C进行编程有关—您可以利用静态库在程序中包含以前创建的函数,以使其能够(至少部分地)执行您想要的操作,这样您就不必重新执行从头开始创建一个已经存在的函数。 这样一来,您的程序将更加高效,并占用更少的内存 。 如果存在错误,从某种意义上讲,只需要搜索和调试一个文件 ,而不是每个单独的可执行文件 。 从此,这个想法继续进行到编译过程 。 只有一个文件需要重新链接到并重新编译,而不是每个单独的目标文件。 这就是为什么我们使用库 。
图书馆如何运作?
在这里,我们将更深入地介绍上述过程的实际工作原理。
之所以行之有效,是因为我们通过将其包含在C程序的顶部来链接到该库。
例如,要使用printf()函数将某些内容写入标准输出(终端-在屏幕上查看),您需要在.c文件中包含库。
它看起来像这样:
#include
int main void()
{
printf();
return (0);
}
上面示例中的键是#include行,这是预处理程序指令。 这告诉编译器在系统文件/目录的标准列表中搜索给定的文件名stdio.h 。 实际上,这与复制头文件的内容相同,扩展名为.h
如果您不包括此内容,则会出现以下错误:
error: implicit declaration of function printf()
基本上是说程序不知道如何使用printf()函数,因为尽管您已经声明了它,但尚未定义它-因此包含了stdio.h库(头文件),其中它被定义,因此可以被调用/利用。
那么,如何创建静态库?
很高兴你问。 用于创建静态库的基本命令在ar程序上调用, ar程序代表Archiver —终于有了(如我所提到并多次提到)。 由于静态库实际上是存档 文件,因此需要对其进行索引,以使编译器能够更快,更有效地标识所需的目标文件在存档文件中的位置。 它本质上为编译器提供了一个目录 。
在命名包含要#include到库 (也称为归档文件)的已定义函数和/或函数原型(如上所述)的对象文件时,基本上可以调用此命令。
您需要目标文件,因此,要创建这些文件,您将必须使用已有的.c文件和/或创建新的.c文件,并具有要包含在存档.a文件中的功能。
为此,基本格式如下所示:
gcc -c file1.c file2.c file3.c
gcc -c *.c
第二个选项将创建当前目录内所有C文件的目标文件,这可能并不总是理想的,因此第一个选项是。
这将生成给定.c文件的(目标文件) .o版本,现在您可以如下所示创建静态库 。
主要命令格式如下:
ar options libraryname objectfile1 objectfile2 objectfile3
如果您要创建有关“狮子王”的库,它将看起来像这样:
ar rc liblionking.a simba.o nala.o timon.o pumba.o mufasa.o sarabi.o
确保不要包括scar.o如果这样做(将近23年的电影-扰流板警报) ,它将杀死Mufasa,您将必须“ 逃走……逃跑,再也不会回来”。 您不想像Simba那样结束吧?
此命令将创建一个名为liblionking.a的静态库,该库现在包含上述指定目标文件的副本。
最后一件重要的事情-参考前面提到的索引编制过程,您可以采用以下两种方法之一来执行此操作。 在调用ar命令时指定-s选项-
ar -s libname objfile1 objfile2
要么
使用称为ranlib的命令— 之后 —您已经创建了库.a文件。 这将创建现在存在于归档中的目标文件的索引(目录)。
因此,由于它与使用C进行编程有关–您将利用静态库在程序中包含以前创建的函数,以使其能够执行您想要的(至少部分执行)操作,从而您不必重新执行从头开始创建一个或多个已经存在的函数。
太好了,除了我该如何使用这些静态库的东西?
与使用上面概述的预加载的系统库文件相比,过程有所不同。 为此,在调用gcc命令时,您实际上需要包括一个特定的选项,以编译要使用新创建的库的.c文件-您的.a文件,并生成.o文件。 此外,您必须命名要包含在.c文件中的库,但要使用修改后的格式- 从 .a 删除 lib 这个词。 文件名,并调用一些特定的选项。
这些选项是-L. 它告诉链接器(编译过程的最后阶段),可以在您指定的任何目录(在本例中为)中找到该库. 指定除了应正常查看的标准系统文件/目录外,还应查看当前目录 (如前所述)。 接下来,您必须使用-l选项代替文件名的lib部分,并且也要省略.a扩展名。 这是因为链接器在搜索库文件名时会重新添加这些文件。 最后, -o选项是创建.o文件(使文件可执行),并允许您使用.c源代码文件中的默认a.out以外的名称命名。
使用我们之前的示例库liblionking.a并希望在新创建的hakunamatata.c文件中使用它并命名可执行文件.o file ‘no_worries’,将它们放在一起,看起来像这样:
gcc hakunamatata.c -L. -l lionking -o no_worries
假设地,如果我们尝试运行它,并且在我们的printf函数中包含了电影的著名报价,它将像这样:
运行可执行文件:
./no_worries
输出到命令行:
“Hakuna matata. It means no worries.”
我希望您了解了有关C静态库的知识,并且您很清楚-

如果不是这样,那么您就像Simba,那就是hakuna matata 。