您需要了解的所有有关C静态库的信息

作者 : IT 大叔 本文共1491个字,预计阅读时间需要4分钟 发布时间: 2020-09-4

介绍

在开始讨论主题之前,让我们简要介绍一下C程序的编译阶段。
基本上有四个阶段:

  1. 前处理
  2. 汇编
  3. 部件
  4. 连结中

在本文中,我们将重点介绍静态库及其在程序链接阶段中的作用。但是,首先,让我们定义一个库。

什么是图书馆?图书馆有什么用?

库是在构建程序时可以调用的代码例程(函数,类,变量等)的集合,因此,我们可以自己从已经编写的东西中获取代码,而不必自己编写它优化。这就是库背后的思想的来源。我们正在重用来自其他地方的代码块。

基本上,我们有两种库:

  • 静态库
  • 共享(或动态)库

编写库的主要原因是允许代码可重用,从而节省了大量的开发时间。

什么是静态库,它如何工作?

静态库是一个文件,其中包含对象文件(* .o)的集合,这些对象文件在编译的链接阶段链接到程序中,而在运行时不相关。

您需要了解的所有有关C静态库的信息插图
如上图所示,在编译程序时,编译器会从源文件生成目标文件。生成目标文件后,编译器还将调用链接器。在这种情况下,链接器的作用是将库的代码复制到我们的目标文件中。

基本上,静态库只是目标文件的集合,链接器将其与另一个目标文件合并以形成最终的可执行文件。

按照惯例,它们以“ lib”开头,以“ .a”或“ .lib”结尾(取决于您的平台)。

如何创建静态库?

要创建静态库,我们需要指定编译器(本例中为GCC),我们希望将所有库代码(.c)编译为目标文件( .o),而无需链接。为此,我们将使用下面的命令。

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

标志说明:
-c:编译和汇编,但不链接。
-Wall,-Werro和-Wextra:这些不是必需的,但建议使用它们来生成更好的代码。

请注意,“ *。c”将当前工作目录中所有带有“ .c”扩展名的文件匹配。

例如,让我们采用两个c文件,即add.cmul.c,它们分别对两个整数进行加法和乘法,而头文件则包含这些函数的原型。下图显示了使用命令后生成的输出。

您需要了解的所有有关C静态库的信息插图(2)

一旦有了目标文件,我们现在可以将所有目标文件捆绑到一个静态库中。
要创建静态库或向现有静态库中添加其他目标文件,我们必须使用GNU ar(存档)程序。我们可以使用如下命令:

$ ar -rc libname.a *.o

此命令将创建一个名为“ libname.a”的静态库,并将目标文件“ add.o”和“ mul.o”的副本放入其中。'c'标志告诉ar创建库(如果尚不存在)。“ r”标志告诉它用新的对象文件插入目标文件或替换库中现有的目标文件。

创建或修改档案后,需要对其进行索引。以后,编译器将使用此索引来加快库中符号的查找速度,并确保在编译期间库中符号的顺序无关紧要。有两种创建或更新索引的方法。第一个是通过使用命令ranlib。

$ ranlib libname.a

或通过向ar命令添加一个额外的标志(-s)来使它像这样:

$ ar -rcs libname.a *.o

下图显示了我们示例中这些命令的执行情况。

您需要了解的所有有关C静态库的信息插图(4)
为了列出库中目标文件的名称,我们可以使用带有-t标志的ar命令。

您需要了解的所有有关C静态库的信息插图(6)

如何使用它们?

现在我们的静态库“ libname.a”已经可以使用。我们可以在程序中使用它。这是通过将库的名称添加到提供给链接器的目标文件中来完成的。首先,让我们创建一个使用上面创建的静态库的C源文件。 现在,我们可以使用以下命令来创建最终的可执行程序:
您需要了解的所有有关C静态库的信息插图(8)

$ gcc main.c -L. -lname -o main

这将使用目标文件“ main.o”以及“名称”静态库中所需的任何符号来创建程序。

标志说明:
-L:指定给定库的路径(“。”表示当前目录)
-l:指定不带“ lib”前缀和“ .a”后缀的库名,因为链接器将这些部分附加返回库的名称以创建要查找的文件的名称。
我们现在要做的就是运行我们的程序。

您需要了解的所有有关C静态库的信息插图(10)

那是我对静态库的总结!

免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » 您需要了解的所有有关C静态库的信息

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论