ldconfig 無法連結到特定文件
我在 Docker 映像中安裝
ATLAS
(使用 NetlibLAPACK
),現在每次執行時ldconfig
,都會出現以下錯誤:ldconfig: Can't link /usr/local/lib//usr/local/lib/libtatlas.so to libtatlas.so ldconfig: Can't link /usr/local/lib//usr/local/lib/libsatlas.so to libsatlas.so
當然,
/usr/local/lib//usr/local/lib/libtatlas.so
不存在,但我很困惑為什麼它會嘗試查找此文件,因為libtatlas.so
它不是符號連結:root@cd00953552ab:/usr/local/lib# ls -la | grep atlas -rw-r--r-- 1 root staff 15242054 Apr 27 08:18 libatlas.a -rwxr-xr-x 1 root staff 17590040 Apr 27 08:18 libatlas.so -rwxr-xr-x 1 root staff 17492184 Apr 27 08:18 libsatlas.so -rwxr-xr-x 1 root staff 17590040 Apr 27 08:18 libtatlas.so
為什麼會發生這種情況,有沒有辦法修復它/關閉此錯誤消息?
編輯:這是 Readelf 輸出:
root@cd00953552ab:/usr/local/lib# eu-readelf -a /usr/local/lib/libatlas.so | grep SONAME SONAME Library soname: [/usr/local/lib/libtatlas.so]
出於某種原因,可能與庫的建構方式(更具體地說,連結)有關,他們將安裝目錄儲存在他們的 soname 中:因此
libtatlas.so
的 soname 是/usr/local/lib/libtatlas.so
.ldconfig
嘗試將庫連結到它們的 soname,如果它不存在,則在同一目錄中:它找到/usr/local/lib/libtatlas.so
,檢查它的 soname,確定需要從/usr/local/lib//usr/local/lib/libtatlas.so
(目錄和 soname 連接)到的連結/usr/local/lib/libtatlas.so
,並且失敗,因為/usr/local/lib/usr/local/lib
沒有’不存在。解決此問題的適當方法是確保正確定義庫的 soname。通常我希望
libtatlas.so.3
等沒有目錄名稱(版本取決於正在建構的庫的 ABI 級別)。您可能需要重建庫,或找到正確建構的包…或者,您可以使用PatchELF編輯庫的 soname :
patchelf --set-soname libtatlas.so /usr/local/lib/libtatlas.so
理想情況下,您應該重新連結使用此庫建構的程序,因為它們也會嵌入 soname(您也可以使用 PatchELF 修補它)。
在一個不斷發展的系統中,您確實希望在 soname 中指定一個版本,但在容器中這可能無關緊要——無論如何您都應該重建容器以進行升級。