动态链接库

欧文·戈夫(Erwin Gove)

编码世界中有两种库,我并不是说您在此之上看到的那种库。 在编码世界中,图书馆通常没有各种书籍,而没有书籍。 库最初是静态库,我在之前的博客文章中对此进行了解释,您可以通过此链接https://medium.com/@ehg50/static-libraries-ec888df2194进行查找。 这些类型的库如何工作的基本原理是,它们包含目标文件,而目标文件中包含函数的目标代码。 使用这个充满目标代码的库,我们可以制作一个可执行文件,该文件可以使用其中的各种功能,并将该可执行文件传递给用户。 这很好用,但是静态库有一些问题。 第一个问题是可执行文件最终容纳了库中所有不同程序的目标代码。 这意味着它们最终会占用大量内存,具体取决于给定库中有多少个函数。 另一个问题是更新。 如果用户拥有公司的较旧的可执行文件,并且更改了库中的某些内容,则他们将必须重新编译整个可执行文件以进行更新。 这两个问题都是由链接程序将库的全部内容添加到可执行文件中引起的。

幸运的是,我们找到了解决这两个问题的方法。 答案是使用动态链接库。 动态链接库和静态链接库之间的主要区别在于,在编译期间,链接器不会将整个目标代码添加到可执行文件中。 而是链接程序将任何所需功能的地址添加到可执行文件中。 这意味着可执行文件的大小只会增加一个地址的大小乘以所使用功能的数目,而不是每个使用功能的大小。 同样,在更新库时,无需重新编译可执行文件,只需下载新库即可。

在Linux中,静态链接库将以.a结束以进行归档,而动态链接库将以.so结束以用于剪切对象。 尽管动态链接的库听起来要好得多,但仍然存在一个主要缺点。 动态链接库的运行速度稍慢一些。 这是因为每次可执行文件需要使用特定功能而不是在其中具有该功能时,都必须使用该地址来查找该功能。 根据要包含的功能数量以及天气存储空间或性能速度是一个更重要的因素,必须决定哪种类型的库链接更合适。

如何制作和使用动态链接库

在此博客中,我仅向您分享如何创建动态链接库,但是正如我在上面提到的某些情况下,最好使用静态链接库。 值得庆幸的是,正如我在上面也说过的,我过去创建了一个博客,深入探讨了静态链接库。 在那篇文章中,我有关于如何再次使用它们的说明,这里是链接https://medium.com/@ehg50/static-libraries-ec888df2194。

要在Linux中创建动态链接库,要做的第一件事是将.c文件编译为目标代码。 在您的gcc命令中,您将需要使用-c标志来生成目标代码和-fPIC。 -fPIC标志代表与位置无关的代码,这将使该代码无论在其首选地址与否都可工作。 将目录中的所有.c文件更改为目标代码的命令如下所示。

gcc -fPIC -c * .c

仅将一个.c文件更改为与位置无关的目标代码的命令。

gcc -fPIC -c example.c

然后,您需要编译动态链接的库。 为此,您需要再次使用gcc命令,但是这次使用-o和-shared标志。 -o标志允许您命名由编译产生的文件,-shared标志使它成为共享对象,也称为动态链接库。 该命令如下所示:

gcc -shared -o libsample.so * .o

对于目录中的所有目标文件,以及仅对于某些目标文件:

gcc -shared -o libsample.so example_1.o example_2.o

一旦创建了动态库,就有多种不同的使用方式,但基本上归结为同一件事。 首先,您需要制作可执行文件并将其链接到可以使用这两个命令执行的库。

gcc -c example_exe.c

gcc -o exe example_exe.o libsample.so

您需要做的第二件事是将文件导出到/ usr / lib /目录中的正确位置。 一种简单的方法是使用具有sudo特权的mv命令。 只有超级用户才能对库目录执行任何操作,因为更改该目录可能会严重影响计算机的性能。 完整的命令将如下所示:

sudo mv libsample.so / usr / lib /

然后,您需要使用以下命令对其进行配置:

须藤ldconfig

请记住,这只是使可执行文件链接到动态链接库的一种方法,但是它确实起作用。 完成此操作后,就可以运行可执行文件了。