为什么我们在Linux中需要.so.1文件?

时间:2014-03-07 18:02:54

标签: c linux dynamic-linking

在Linux中,对于共享库,我通常会看到一个库的.so,.so.1和.so.1.0文件。例如,库测试应该由libtest.so libtest.so.1 libtest.so.1.0文件提供。 据我了解,.so.1.0包含真实数据; .so链接到.so.1.0并用于链接。 但我不明白.so.1文件的目的。 有人可以澄清.so.1文件的使用吗? 谢谢。

2 个答案:

答案 0 :(得分:15)

假设我们正在谈论libtest。如果你环顾四周,你会看到libtest.so,这是libtest.so.1的链接,后者又链接到libtest.so.1.5

在这种情况下,使用libtest的可执行文件将链接到libtest.so.1(这将写入可执行文件,请参阅ldd(1))。如果您的发行版更改libtest以修复错误,则新版本可能会提供libtest.so.1.6。只要没有进行ABI更改,一切正常。并且没有API更改的事实由未更改的1版本号发出信号。

让我们说繁忙的libtest海狸提出了一个新的,全部闪亮的,从头开始重写的库,改变了ABI。随着ABI的更改,它们将版本号更改为2.您安装该版本号,现在您拥有链libtest.so --> libtest.so.2 --> libtest.so.2.1。请注意,您现在已安装版本1和2。您的早期程序仍然可以使用libtest.so.1正常工作,但如果您编译新程序,编译器(链接器,真的)将选择libtest.so,从而将可执行文件指向新的libtest.so.2.1

请注意,版本号不需要与源代码版本号有任何关系;主要编号是ABI版本,次要编号是可选的,可用于跟踪修订。所以这里(Fedora 20)我正在使用systemd-libs-208-15.fc20.x86_64,它提供libsystemd-daemon.so.0.0.10

答案 1 :(得分:2)

这些是同一个库的不同版本。

通常,您需要最新的稳定版本的库,因此您链接到x.so,该链接到最新版本。当新版本可用时,例如x.so.2,您可以通过将x.so链接到x.so.2来使整个系统使用它

有时您想要链接到旧版本 - 例如,如果您的程序依赖于'看到已修复的怪癖,或者最新版本引入了错误。有时您想要链接到新的实验版本 - 例如,如果您正在测试它,或者它是否修复了当前版本中的错误。在这种情况下,您将直接链接到编号版本 - 希望作为临时措施。