我只有一台安裝了 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等等。 ABI:新版本可以新增功能,但不能破壞現有功能。任何重大變化都意味著 soname 的變化。

如果所有這些都正確完成(在庫方面),那麼您不應該需要具有以下功能的庫的多個版本相同的soname:只要您擁有最新版本,您就可以執行針對具有相同 soname 的任何版本的程式庫所建立的任何軟體。繼續這個libreadline例子,使用 5.1 版庫建立的軟體在 5.2 版上運作良好。 (反之則不一定成立;使用 5.2 中新功能的軟體將無法在 5.1 中運作。)

libtool如果您還沒有使用它,可能值得研究一下(是的,我知道):它有一個相當可用的功能版本控制方案處理 soname 碰撞。

有些庫不遺餘力地盡量減少對 soname 顛簸的需要; GNU C 函式庫就是一個例子,它廣泛使用符號版本控制來避免破壞 ABI,同時仍然引入新功能和向後不相容的變更(它只是保留舊版本,裡面圖書館)。

相關內容