C++

發布linux軟體——兼容性

  • May 26, 2015

我想為 Linux 發布一個​​ C++ 庫。是否真的(當沒有其他庫動態連結時)只有 glibc 版本決定與其他 Linux 發行版的兼容性?

有沒有比設置多個虛擬機並在那裡編譯更好的方法來支持過去 5 年的大多數 Linux 發行版?例如,在非常舊的 Linux 系統上編譯的 Linux 二進製文件能否在新的 Linux 版本上執行?

Linux 的核心 API 非常穩定。(我說的是系統呼叫,而不是核心中的 API。)自 1997 年左右產生的靜態連結執行檔(切換到ELF作為可執行格式)應該適用於任何目前的 Linux 系統。然而,靜態連結的執行檔有許多缺點:體積龐大,當在第三方程式碼中發現錯誤時無法輕鬆升級,並且由於無法與某些系統功能互動,它們往往會生活在自己的氣泡中標準庫為其提供了可配置的支持(例如 DNS、語言環境、使用者帳戶……)。

對於庫,一個常見的約定是版本中第一個數字的更改表示不兼容的 ABI 更改,而版本的其餘部分隨著向後兼容的更改而增加。因此,例如,如果您的程序與 2.3 版連結,它將適用於 2.3 或 2.4 版的庫,但不適用於 2.2 或 3 版。有些庫使用不同的約定。動態連結器使用庫中記錄的soname來決定其版本是否合適。

非嵌入式 Linux 上的標準庫是Glibc。自 1998 年左右以來,Linux 上 Glibc 的主要版本一直是 6(因此稱為 libc6);上游的主要版本是 2,這就解釋了為什麼 libc6 的版本是 2. MINOR而不是 6. MINOR。原則上,與舊版本 libc6 連結的程序應該適用於較新版本,儘管早期並非總是如此。任何與 Glibc 2.3 或更高版本連結的程序都應該在目前版本上執行。

標準 C++ 庫過去更改得更快,但目前的主要版本 (6) 自 2005 年左右以來一直是最新的。

如果您在較舊的系統上編譯程序,它應該可以在較新的系統上執行,前提是所需的庫版本可用。以CentOS 支持的最舊版本(目前為 5)和最舊的$$ old $$穩定的 Debian 發行版(目前令人喘不過氣來,儘管擠壓可能仍然符合條件);如果您生成在兩者上執行的二進製文件,它可能適用於所有 Linux 安裝(不包括嵌入式系統和執行不再提供安全更新的過時版本的系統)。

引用自:https://unix.stackexchange.com/questions/205470