C 为什么Linux中需要.so.1文件?

C 为什么Linux中需要.so.1文件?,c,linux,dynamic-linking,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文件的用法吗? 谢谢 这些是同一个库的不同版本 通常,您需要库的最新稳定版本,因此可以链接到x.so,它链接到该最新版本。当新版本可用时,比如说x.so.2,您可以通过将x

在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文件的用法吗?
谢谢

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

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


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

假设我们讨论的是
libtest
。如果您环顾四周,您将看到
libtest.so
,它是指向
libtest.so.1
的链接,该链接依次指向
libtest.so.1.5

在本例中,使用
libtest
的可执行文件将链接到
libtest.so
,即
libtest.so.1
(这将写入可执行文件,请参见
ldd(1)
)。如果您的发行版更改了
libtest
以修复错误,新版本可能会提供
libtest.so.1.6
(更新
libtest.so.1
链接后,运行的程序仍将使用
libtest.so.1.5
,直到退出)。只要不进行ABI更改,一切正常。没有API更改的事实由未更改的1版本号表示

比如说,忙碌的libtestbeavers推出了一个全新的、光鲜亮丽的、从头重写的库,其中包含更改的ABI。随着ABI的更改,他们将主版本号更改为2。您安装了这个,现在就有了链
libtest.so-->libtest.so.2-->libtest.so.2.1
。注意,您现在已经安装了版本1和版本2。使用
libtest.so.1
,您以前的程序仍然可以正常运行,但是如果您编译一个新程序,编译器(实际上是链接器)将拾取
libtest.so
,从而将可执行文件指向新的
libtest.so.2.1
(除非特别要求使用旧版本)

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