我只有一台安裝了 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,同時仍然引入新功能和向後不相容的變更(它只是保留舊版本,裡面圖書館)。