共享庫的「替代品」?這還有效嗎?

共享庫的「替代品」?這還有效嗎?

我正在嘗試連結一個具有幾種不同實現的共享庫 - 特別是 blas、openblas 和 atlas 都透過/usr/lib/libblas.soUbuntu 14.04 上的替代方案提供相同的二進位介面(以及 12.04 上類似但不完全相同的設定)。當我將 GCC 與-lblas鏈接器一起使用時,似乎實際上通過替代鏈接解析到實際實現,因此- 例如,如果我安裝了openblas,它將鏈接到實際的openblas 二進製文件,然後如果我在系統上安裝生成的可執行檔在安裝了 atlas 的情況下,動態連結器將無法載入庫,因為它看不到替代連結。

有沒有辦法讓 GCC 使用「替代」符號連結作為 dl 目標,以便它實際上按update-alternatives預期工作?

答案1

符號連結解析是這裡的功能。透過解析libblas.soto libblas.so.3,產生的可執行檔將固定到特定的 so 版本。 (當庫的二進位介面向後不相容地更改時,會發生對 so 版本的更改,即3in ,因此這是期望的。libblas.so.3

問題似乎是您的目標系統沒有libblas.so.3,所以我建議如下:

  1. libblas.so.3確保您的應用程式已經連結到。
  2. 在目標系統上,建立從實際 libblas.so 到所需名稱的符號鏈接libblas.so.3,以便在 LD_LIBRARY_PATH 中找到此符號連結:

    mkdir ./mylib
    ln -s /usr/lib/libblas.so ./mylib/libblas.so.3
    LD_LIBRARY_PATH=$PWD/mylib:$LD_LIBRARY_PATH ./myexecutable
    

相關內容