在 Linux 中,对于共享库,我通常会看到一个库的 .so、.so.1 和 .so.1.0 文件。例如库test应该由libtest.so libtest.so.1 libtest.so.1.0文件呈现。 据我了解,.so.1.0 包含真实数据; .so 链接到 .so.1.0 并用于链接。 但我不明白 .so.1 文件的用途。 有人可以澄清 .so.1 文件的用途吗? 谢谢。
最佳答案
假设我们正在谈论 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 进行更改,一切正常。未更改的 1 版本号表明没有 API 更改这一事实。
假设忙碌 libtest
beavers 提出了一个全新的、 Shiny 的、从头开始重写的库,并更改了 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
.
关于c - 为什么我们在 Linux 中需要 .so.1 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22257445/