我只有一台安装了 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,同时仍然引入新功能和向后不兼容的更改(它只是保留旧版本,里面图书馆)。