Linux
當有 libfoo 的版本名稱但沒有 libfoo.so 時如何使用 -lfoo 進行連結
假設
/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
,我可以使用哪些變通方法在執行時成功連結 libfoosillyprog
?
一種選擇是在您控制的目錄中創建一個指向庫的正確名稱的連結。然後你可以使用
LIBRARY_PATH
和LD_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