Linux

當有 libfoo 的版本名稱但沒有 libfoo.so 時如何使用 -lfoo 進行連結

  • May 9, 2022

假設/usr/lib/x86_64-linux-gnu/包含 libfoo:

  • libfoo.so.2-> libfoo.so.2.0.0(符號連結)
  • libfoo.so.2.0.0

值得注意的是libfoo.so.

假設有一個程序/usr/local/bin/sillyprog使用類似gcc somefile.c -lfoo. 每次我嘗試使用sillyprog時,它都會失敗,/usr/bin/ld: cannot find -lfoo因為libfoo.so缺少。

假設我無權編輯其中的任何文件/usr,我可以使用哪些變通方法在執行時成功連結 libfoo sillyprog

一種選擇是在您控制的目錄中創建一個指向庫的正確名稱的連結。然後你可以使用LIBRARY_PATHLD_LIBRARY_PATH環境變數來指向這個目錄。這些變數分別影響連結器和載入器在編譯或執行程序時查找庫的位置。根據GCC 文件

的值LIBRARY_PATH是以冒號分隔的目錄列表,很像PATH. 當配置為本地編譯器時,GCC 會在搜尋特殊連結器文件時嘗試指定的目錄,如果使用GCC_EXEC_PREFIX. 在為選項搜尋普通庫時,使用 GCC 進行連結也使用這些目錄 -l(但-L首先指定的目錄)。

所以,像:

mkdir -p ~/.local/lib
ln -s /usr/lib/x86_64-linux-gnu/libfoo.so.2 ~/.local/lib/libfoo.so

然後,執行一個libfoo.so用於編譯的程序:

LIBRARY_PATH=~/.local/lib sillyprog

或者執行一個本身連結到的程序libfoo.so

LD_LIBRARY_PATH=~/.local/lib sillyprog

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