假设/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
?
答案1
一种选择是在您控制的目录中创建具有正确名称的库的链接。然后你可以使用LIBRARY_PATH
和LD_LIBRARY_PATH
环境变量来指向这个目录。这些变量分别影响链接器和加载器在编译或运行程序时查找库的位置。根据海湾合作委员会文档:
的值
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