我只有一台安装了 Linux 的 PC。但是,我有同一个库的多个版本。因为不同的软件可能依赖于同一个库的不同版本,所以我必须将它们全部保留在系统上。

您有什么好主意可以让它们保持良好运转吗?

欢迎任何参考。

[更新]

例如:

我有两个版本的g++,例如g++4.8 和g++5.2。

我希望它们的相关文件存储在不同的路径中,例如: /soft/g++/4.8//soft/g++/5.2

当我使用g++时,我可以通过简单的命令轻松更改版本。我找到了软件环境管理http://modules.sourceforge.net/

答案1

如果您的图书馆定义了它的索纳姆正确的是,您可以毫无困难地安装多个版本。例如我目前libreadline安装了三个版本:

$ ls -l /lib/x86_64-linux-gnu/libreadline.so.*
lrwxrwxrwx 1 root root     18 Dec  4  2015 /lib/x86_64-linux-gnu/libreadline.so.5 -> libreadline.so.5.2
-rw-r--r-- 1 root root 263352 Dec  4  2015 /lib/x86_64-linux-gnu/libreadline.so.5.2
lrwxrwxrwx 1 root root     18 Oct  4  2016 /lib/x86_64-linux-gnu/libreadline.so.6 -> libreadline.so.6.3
-rw-r--r-- 1 root root 296792 Oct  4  2016 /lib/x86_64-linux-gnu/libreadline.so.6.3
lrwxrwxrwx 1 root root     18 Jan 24 16:17 /lib/x86_64-linux-gnu/libreadline.so.7 -> libreadline.so.7.0
-rw-r--r-- 1 root root 309168 Jan 24 16:17 /lib/x86_64-linux-gnu/libreadline.so.7.0

这是有效的,因为程序链接到 soname,因此为版本 5 构建的任何内容都会链接到libreadline.so.5,为版本 6 构建的任何内容都会链接到libreadline.so.6等等。库方面的要求是具有相同 soname 的所有版本必须保留其 ABI:新版本可以添加功能,但不能破坏现有功能。任何重大变化都意味着 soname 的变化。

如果所有这些都正确完成(在库方面),那么您就不需要使用具有相同的soname:只要您拥有最新版本,您就可以运行针对具有相同 soname 的任何版本的库构建的任何软件。继续这个libreadline例子,使用 5.1 版库构建的软件在 5.2 版上运行良好。 (反之则不一定成立;使用 5.2 中新功能的软件将无法在 5.1 中运行。)

libtool如果您还没有使用它,可能值得研究一下(是的,我知道):它有一个相当可用的功能版本控制方案处理 soname 碰撞。

有些库不遗余力地尽量减少对 soname 颠簸的需要; GNU C 库就是一个例子,它广泛使用符号版本控制以避免破坏 ABI,同时仍然引入新功能和向后不兼容的更改(它只是保留旧版本,里面图书馆)。

相关内容