簡體   English   中英

Debian Buster 中的庫不匹配?

[英]Mismatched libraries in Debian Buster?

注意:所有這些工作都是在一個封閉的網絡上完成的(即沒有互聯網接入)。

我被 GCC 5.0+ STL 發生的變化所困擾。 據說其他帖子從 GCC 5.0 開始,標准模板庫經歷了更新,現在有舊版 stl 和嚴格合規 stl。 使用 _GLIBCXX_USE_CXX11_ABI 1 構建的代碼不會與使用 _GLIBCXX_USE_CXX11_ABI 0 構建的代碼鏈接。設置為 0 表示舊版 stl(即 std::string),而設置為 1 則構造 std::__cxx11::string。

如果重新構建所有用戶代碼以匹配新庫,那么可以使用,但是如果 debian 包的構建不同怎么辦? 怎么辦?

例如,將 Debian 8.11 (Jessie) 系統升級到 10.3 (Buster),升級中包括 Boost 和 Protobuf。 現在使用默認的 _GLIBCXX_USE_CXX11_ABI 1 構建我的軟件並使用 Protobuf 獲取鏈接錯誤,因為它似乎是使用 pre-gcc 5.0 或 ABI 設置為 0 構建的 Protobuf。Boost 還有其他問題,它無法找到一些 std::__cxx1112::string (見過一次)或只是std :: string。

下載了 Boost 的源代碼,轉移到封閉網絡,並使用 ABI 1 構建,我的代碼現在鏈接到 boost,但仍然無法鏈接到 protobuf。 使用 ABI 0 構建了 Boost 和我的代碼,現在兩者的鏈接都成功了。

仍在獲取 Buster 的新鏡像以確定是否可以解決,但是我擁有的版本有不匹配的庫(不兼容)

這只是一個警告,並非所有事情都像看起來那樣。

Boost 從 1_55 到 1_67,protobuf 9 到 17,gcc 4.8 到 8。此外,在撰寫本文時,Glassfish 與 Buster 版本的 JDK 不兼容。

我也遇到了導致這個問題的問題。

我挑幾個點來說明:

如果重新構建所有用戶代碼以匹配新庫,則可以正常使用

的確

但是如果 debian 包的構建不一樣呢? 怎么辦?

這通常不會發生。 Debian 的 QA 和構建服務器受到非常嚴格的控制,除非有人非常嚴重地滑倒,否則不會出現這種情況 - 即便如此,除非 package 沒有用戶,否則它會在測試中立即被注意到。

[...] Protobuf 出現鏈接錯誤,因為看起來 Protobuf 是使用 pre-gcc 5.0 或 ABI 設置為 0 [...]

如果您似乎仍然處於這種情況,我們可以像我之前的回答一樣進行一些分析,但這次是針對 libprotobufX。 可能發生的是

  • 您的庫路徑中有流氓(非發行版)共享庫(檢查ldconfig 、 LD_LIBRARY_PATH 、 -L 標志)

    或者,在成功的鏈接上(因此使用解決方法)檢查鏈接的二進制文件上的ldd是否從預期位置加載 libprotobufXXX.so。 如果有一個意想不到的位置,可能會有

    • 如上所述的ldconfig位置
    • 可能有RPATH / RUNPATH條目由 linker 烘焙到 ELF 映像中(在您的構建腳本中查找 -Wl -Wl,rpath或類似內容)。 要檢查二進制文件以確認這一點:

       objdump -x binary-or-library |grep RPATH objdump -x binary-or-library |grep RUNPATH
  • 您的升級可能沒有成功更新 package(檢查升級過程是否有錯誤,您的 repo-mirror 的狀態)

  • 你有一個非 Debian(或不受支持)的 apt 源列表(檢查/etc/apt/sources.list/etc/apt/sources.list.d/*.list ) - 這些構建可能不支持相同的級別發行版一致性

    副業,通常是規范的啟動板 PPA 傾向於重用發行版構建基礎架構,所以我認為只要發行版/組件條目與您的安裝匹配,它們通常就可以了

    或者,您可以在完整的apt-get update后檢查 APT 緩存的內容,例如

     apt-cache show libprotobuf.*

    順便說一句,如果您確實發現 package 有問題,這也會為您提供維護人員和聯系地址。 (可能有更適合這個的錯誤跟蹤器,我在這個領域不知道)

希望這可以幫助您找到潛在客戶


仍在獲取 Buster 的新鏡像以確定是否可以解決

這聽起來像是一個很好的步驟

但是我擁有的版本有不匹配的庫(不兼容)

我不確定那是什么意思

Boost 從 1_55 到 1_67,protobuf 9 到 17,gcc 4.8 到 8。此外,在撰寫本文時,Glassfish 與 Buster 版本的 JDK 不兼容。

哇,這些都是大跳躍。 如果 JDK 是個問題,IME 有助於安裝 Java 8 或 9 JDK/JRE 並將其設為默認值,例如

$ update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).
  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
* 2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM