C中的静态库:简要视图。

维吉里奥·巴可图书馆。

到底是什么,为什么要使用它?

在C中,它称为某些类型的文件的库,我们可以将其导入或包含在程序中。 这些文件包含已构建并可用的各种功能的规范,我们可以将其添加到程序中,例如阅读键盘或在屏幕上显示某些内容。

为了将这些库包含不同功能的定义,我们可以节省很多事情,例如,想象一下,每次我们需要用键盘阅读时,我们都应该使用C中的库创建一个功能(确实很复杂),可以利用各种功能,使生活更轻松,并增加我们代码的模块化。

什么是静态库?

静态库,也称为文件,是带有几个打包的目标代码文件的容器文件,在编译过程中进行链接的过程中(有关更多信息,请单击此处),将在其中复制并重新放置该库。最终的可执行文件,以及其余的目标代码文件。 此过程以及可执行文件被称为目标应用程序的静态构造。 在这种情况下,该库仅充当目标代码文件的容器,这些目标代码文件与在程序编译的前一阶段生成的中间目标文件没有什么不同(仅在语义上没有区别)。 在编译文件的静态构造中,在编译时(更具体地说,在链接阶段)解决了汇编子例程的地址,因此对库子例程的引用也与对程序的任何其他功能的引用相同,都是静态解决的。 。 因此,实际地址,跳转引用和对例程的其他调用都以相对或符号方向存储。

链接器通过在运行时将所有代码(包括库)加载到内存位置中,将所有未解析的地址转换为固定或可重定位的地址(从公共基础)来解析这些地址。 此链接过程的持续时间甚至比编译过程还要长,并且每次重新编译一个模块时都必须完成。

链接器可以处理特定类型的目标文件,因此需要特定(兼容)类型的库。 在库中重新编译的目标文件可以轻松分发和使用。 客户端(无论是程序还是其他库)访问仅通过其名称引用的对象库。 链接过程通过查看给定顺序的库来解决引用。 通常,如果可以在一组特定的库中多次找到名称,则不认为是错误。

使用GCC创建静态库文件

我们需要将我们的库代码编译成一个目标文件,因此使用-c可以将所有“ .c”文件转换为它们各自的目标文件。

 $ gcc -Wall -pedantic -Werror -Wextra -c *.c 

我们使用GNU ar命令来创建最终的库/档案。

  $ ar -rc libholberton.a *.o 

选项-c

创建档案。 当您请求更新时,总是创建指定的归档 (如果不存在)。 但是会发出警告,除非您事先使用此修饰符指定要创建它。

选项-r

将文件成员 …插入存档替换为 )。 此操作与q的区别在于,如果任何先前存在的成员的名称与要添加的成员相匹配,则将其删除。

完成ar后,需要对库建立索引,这可以通过 ranlib 命令完成

ranlib生成一个对档案内容的索引并将其存储
在档案中。 索引列出了每个成员定义的符号
是可重定位目标文件的档案。

  $ ranlib libholberton.a 

我们还可以使用nm命令在库中查看符号,该命令列出了目标文件中每个符号的符号值,符号类型和符号名称。

现在,我们已经创建了一个静态库libholberton.a,现在让我们在创建程序可执行文件时在编译和链接过程中调用它来使用该静态库。 如果是gcc,我们使用以下标志来创建静态库。

  • l 链接时搜索名为库的库 。 (使用库作为单独参数的第二种替代方法仅是为了符合POSIX,不建议这样做。)
  • 搜索的目录包括几个标准系统目录以及您使用-L指定的目录。
  gcc main.c -L。  -lholberton -o主 

它创建一个名为“ main”的可执行文件

使用静态库生成的可执行文件与从单个源文件或目标文件生成的可执行文件没有区别。 在运行时不需要静态库,因此在分发可执行文件时无需包括它们。 在编译时,链接到静态库通常比链接到单个源文件快。