静态和动态(共享)库之间的区别。

在C程序编译的链接阶段创建库,在该阶段将程序转换为可以执行的机器代码。 如上图所示,C程序可以将两种类型的库转换为静态库或动态(共享)库。 您可能想知道库中包含什么,答案是函数的集合。 为了访问这些功能,我们使用头文件。 但是静态库到底是什么?

静态库是UNIX系统上提供的库。 静态库比共享库更大,更快,但是静态库更大,并且如果对静态库进行任何更改,则必须重新编译和重新链接。

静态库是使用以下方法创建的:

在上面的代码中, ar创建,修改和提取了档案,而档案是一个文件,其中包含易于访问的其他文件的集合。

-rc标志包含两个不同的组件。 r将文件插入指定的归档文件,并替换库中存在的较旧的目标文件。 如果尚未创建存档,则c创建存档。

第三部分liball.a是由c在前面的描述中创建的归档文件

* .o选择所有以.o结尾的文件,例如:school.o,commute.o和code.o。 由于ar中的r ,所以将目标文件插入到归档文件liball.a中。

为了为我们的档案创建索引,您将使用以下命令:

Ranlib liball.a会在liball.a档案中生成索引或更新索引。 但是有时存档器会自己创建索引。

为了使用静态库,您将使用以下内容:

使用此命令,您将使用目标文件main.o并从liball静态库创建一个程序。

-L。 标志表示可以在当前目录“。”中找到库的链接器。 代表当前目录。

我们删除了所有的lib和.a并用-l替换了它,该文件列出了库名称以及目标文件,然后将其提供给链接器。

动态(共享)库是动态链接的,并包含库的地址。 动态库也可以在运行时链接,而不是在编译时链接,这意味着每个程序都可以访问库中的函数,而不必使同一函数倍数。

为了创建动态库,可以使用以下方法:

上面的代码将编译并将文件输入到liball.so库中。

代码各部分的作用:

-fPIC标志代表“位置无关代码”,这是共享库所必需的。 使用此代码,它可以将库定位在任何虚拟地址上,而无需在库中复制功能的多个副本。

-shared标志创建一个共享库,该共享库以lib开头,以.so结尾,就像上面的示例代码“ lib all .so”一样

为了使用动态库,您将使用以下内容: