为什么图书馆在C中很重要

要了解什么是库,我们首先需要了解什么是目标文件。 目标文件是包含目标代码的文件。 目标代码是机器代码,其中包含符号形式的链接器附加信息。 这些符号用于索引库,以便链接程序可以轻松地遍历文件。 我们需要目标代码中的文件,以便可以将它们注入库中。 要阻止我们的文件成为可执行文件,请使用$ gcc -c ,它会在Linker阶段之前暂停编译。 一旦使用这些目标文件创建了库,我们就可以继续进行编译。 但是在到达那里之前,我们需要知道什么是图书馆。 在此博客中,我还将向您展示如何创建和使用静态库。

什么是图书馆?

现在我们知道了什么是目标文件,接下来我们可以讨论库。 库是一个包含多个目标文件的文件,可以在程序的链接阶段用作单个实体。 库有2种类型-静态库和共享(动态)库。

静态库是对象文件的集合,这些对象文件在编译的链接阶段被链接到程序中。 每次使用程序运行时,都会将这种类型的库附加到可执行文件中。 这意味着,如果您要运行可执行文件,则无需担心客户端在其系统上是否具有正确的库。 基本上,由于库代码是在编译时连接的,因此最终的可执行文件在运行时不依赖库。

共享(也称为动态)库是对象文件的集合,该文件在两个阶段中链接在一起。 首先,在编译期间,链接程序将验证是否所有符号都已链接到程序中还是位于其共享文件之一中。 主要区别在于动态库中的目标文件未插入可执行文件中。 相反,当程序启动时,称为“动态加载程序”的程序检查哪些共享库与该程序链接,将它们加载到内存中,然后将它们附加到内存中的程序副本中。 此过程使程序的运行速度稍慢,但没有超过允许第二个程序链接到相同的库并使用相同的副本执行的优点。

为什么要使用库?

使用库的主要原因是使编译更容易。 假设我们有一个函数可以调用100多个其他函数。 编译这些命令的命令行将是巨大而混乱的,因为我们必须在命令行中包含所有这些函数。 相反,我们可以将所有这些功能编译到一个库中,而只需使用一个简单的命令即可将该库链接到我们的文件。

  $ gcc file1.c file2.c file3.c file4.c file5.c file6.c file7.c file8.c main.c -o程序 

相比:

  $ gcc main.c -L。  -library -o程序 

如何创建静态库

我们需要做的第一件事是获取我们要包含在库中的所有.c文件,并使其成为目标文件(.o文件)。 在这种情况下,我们将获取当前目录中的所有.c文件并包括它们:

  $ ls 
  0-isupper.c
 0内存集
 0-strcat.c
 100点
 1位数字
 1-memcpy.c
 1-strncat.c
 2-strchr.c
 2链
 2-strncpy.c
 3-islower.c
 3台
 3-strcmp.c
 3-链
 4-isalpha.c
 4-strbbrk.c
 5条
 6个绝对
 9-strcpy.c $ gcc -c * c $ ls * .o
 0-isupper.o
 0-记忆集
 0-strcat.o
 100-atoi.o
 1个数字
 1-memcpy.o
 1-strncat.o
 2-strchr.o
 2-strlen.o
 2-strncpy.o
 3-islower.o
 3个
 3-strcmp.o
 3-链
 4-isalpha.o
 4-strpbrk.o
 5str
 6个绝对
 9-strcpy.o 

通过使用$ gcc -c *.c ,我们将当前目录中所有以.c结尾的文件更改为以.o结尾的目标文件代码。 这样,我们现在可以使用所有.o文件,并使用它们创建一个库。 为此,我们使用代表“存档”的ar命令。 该工具用于专门创建静态库。 ar还可以用于修改静态库中的目标文件或列出库中目标文件的名称等。 对于此示例,我们将创建一个名为libbetty.a的库:

  $ ar -rc libbetty.a * .o 

这将创建一个名为libbetty.a(档案库)的静态库,并将上面列出的所有.o文件的副本放入其中。 如果库文件已经存在,则会向其中添加目标文件,如果目标文件比其中的文件新,则将其替换。 我们使用标志“ c”来创建文件,因为我们还没有名为libbetty.a的文件。 然后,我们使用’r’标志将库中的旧目标文件替换为较新的版本(如果我们已经有一个名为libbetty.a的库)。

现在我们有了一个档案,我们需要对其进行索引。 这很重要,因为在将库链接到可执行文件时,编译器使用它来加快符号查找的速度。

  $ ranlib libbetty.a 

如何使用静态库

现在我们有了适当的索引库,然后可以在程序中使用它了。

  $ gcc main.c -L。  -lbetty -o程序 

这将使用main.c文件以及“ betty”静态库中所需的任何符号来创建一个名为“ program”的程序。 如果您注意到了,我们在链接命令的libbetty.a文件中省略了“ lib”前缀和“ .a”后缀。 链接器会将这些部分附加回库的名称,以创建要查找的文件的名称。 我们也使用了“ L”标志。 该标志告诉链接器可以在当前目录(“。”)以及标准位置中找到库。 我们还使用了“ -lbetty”,这是在命令行中包含库的表示法。

这就是创建静态库并使用它的方式。 现在,创建所需的所有静态库!