当存在 libfoo 的版本名称但没有 libfoo.so 时如何使用 -lfoo 进行链接

当存在 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,我可以使用什么解决方法来在运行时成功链接 libfoo sillyprog

答案1

一种选择是在您控制的目录中创建具有正确名称的库的链接。然后你可以使用LIBRARY_PATHLD_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

相关内容