是否可以使用同一個庫的多個分支來製作多個需要不同版本的庫工作的軟體?
我想知道是否可以在 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 個軟體全部工作?
您可以安裝單個庫的多個版本嗎?
當然是!*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
並且可能沒問題),或者想找出你所依賴的東西,並且只需要連結到支持它的庫版本。