我想知道 Linux 中是否可以有一个库的多个实例。
例子 :
- 软件 A 需要库 X 的 1.0、1.1 或 1.2 分支或更早版本才能工作
- 软件 B 需要库 X 的 1.4 分支或任何更新的 1.x 才能工作
- 软件 C 需要库 X 的 2.0 分支或更高版本才能工作
是否可以安装 Library X 的 1.2、1.8 和 2.3 以使这 3 个软件都正常工作?
答案1
您可以安装单个库的多个版本吗?
当然是! *nix 下的包管理实际上使这变得非常简单。它唯一需要的是包不冲突(这意味着打包者可能需要完成一些技巧)。但是,您真正的问题需要更深入的答案。
像这样安装多个版本的库会让使用不同版本的软件正常工作吗?
或许。这取决于每个软件如何链接到所需的库。例如,如果您查看/usr/lib
,您会注意到大多数库在此目录中至少有两个不同的文件(libname.so
其中libname.so.#.#.#
是#
一个数字)。您可能会注意到这libname.so
通常是第二个文件的符号链接。通常来说,这是因为软件可以选择链接到库的特定版本,或链接到未版本化的库的任何版本(通常是最新版本)。
现在,如果每个软件对其使用的库版本都有这样的特定要求,那么它们可以直接选择它们需要的版本(而不是希望未版本化的库是它们想要的版本)。如果是这种情况,那么您可能已经回家了,您所需要做的就是正确安装不同的库版本。然而,如果这些软件之一链接到未版本化的链接,但期望它是库的特定版本,则除非未版本化的链接恰好是它们期望的版本,否则它将起作用。
我们用一个例子来演示一下。在 Arch Linux 下,libpng
官方打包了两个版本(1.2
和1.6
)。我碰巧两个都安装了。
$ ls -l /usr/lib | grep png
lrwxrwxrwx 1 root root 18 Mar 12 08:05 libpng12.so -> libpng12.so.0.51.0*
lrwxrwxrwx 1 root root 18 Mar 12 08:05 libpng12.so.0 -> libpng12.so.0.51.0*
-rwxr-xr-x 1 root root 168K Mar 12 08:05 libpng12.so.0.51.0*
lrwxrwxrwx 1 root root 19 Jun 27 19:53 libpng16.so -> libpng16.so.16.12.0*
lrwxrwxrwx 1 root root 19 Jun 27 19:53 libpng16.so.16 -> libpng16.so.16.12.0*
-rwxr-xr-x 1 root root 216K Jun 27 19:53 libpng16.so.16.12.0*
lrwxrwxrwx 1 root root 11 Jun 27 19:53 libpng.so -> libpng16.so*
现在,查看这组文件,您会注意到libpng.so
(完全未版本化的链接)指向libpng16.so
(没有 soname 的版本化链接),它指向libpng.so.16.12.0
.因此,如果一个软件选择链接到libpng.so
,那么在我的系统上,它将链接到libpng.so.16.12.0
;希望这就是该软件所期望的。但是,如果该软件实际上需要 的版本1.2
,就会出现问题。
这里的结论是,如果您正在打包软件,请弄清楚它对库版本有哪些硬性要求,并确保在编译步骤中,它链接到正确的版本。如果您是开发人员,教训是您应该尝试使您的软件与您链接到的所有库的最新版本保持同步(这样您就可以直接链接到libname.so
并且可能没问题),或者计算找出您所依赖的东西,并且只需要链接到支持它的库的版本。