如何在 GCC Linux 中指定非默认共享库路径?运行时出现“加载共享库时出错”
Posted
技术标签:
【中文标题】如何在 GCC Linux 中指定非默认共享库路径?运行时出现“加载共享库时出错”【英文标题】:How to specify non-default shared-library path in GCC Linux? Getting "error while loading shared libraries" when running 【发布时间】:2012-02-08 17:50:59 【问题描述】:有一台笔记本电脑我没有root权限。
在我使用configure --prefix=$HOME/.usr
安装了一个库的机器上。
之后,我在~/.usr/lib
中获得了这些文件:
libXX.so.16.0.0
libXX.so.16
libXX.so
libXX.la
libXX.a
当我编译一个程序时,该程序使用此命令调用库提供的函数之一:
gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX
xxx.out 是在没有警告的情况下生成的,但是当我运行它时会抛出这样的错误:
./xxx.out: error while loading shared libraries: libXX.so.16: cannot open shared object file: No such file or directory
,虽然 libXX.so.16
驻留在那里。
我毫无头绪的假设是 ~/.usr/lib
在调用 xxx.out 时没有被搜索。
但是我该怎么做才能指定 .so 的路径,以便 xxx.out 可以在那里查找 .so 文件?
另外,当我将-static
提供给 gcc 时,会发生另一个错误,如下所示:
undefined reference to `function_proviced_by_the_very_librar'
似乎.so
无关紧要,即使-L
和-l
被赋予gcc。
我应该怎么做才能用那个库构建一个可用的 exe?
对于和我有同样问题的其他人
我找到了a useful article at tldp 关于这个。
它介绍了静态/共享/动态加载库,以及一些使用它们的示例代码。
【问题讨论】:
【参考方案1】:有两种方法可以实现:
使用-rpath
链接器选项:
gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX -Wl,-rpath=/home/user/.usr/lib
使用 LD_LIBRARY_PATH
环境变量 - 将此行放入您的 ~/.bashrc
文件中:
export LD_LIBRARY_PATH=/home/user/.usr/lib
这甚至适用于预生成的二进制文件,因此您可以例如从 debian.org 下载一些包,将二进制文件和共享库解压到您的主目录中,然后在不重新编译的情况下启动它们。
为了快速测试,您也可以(至少在 bash 中):
LD_LIBRARY_PATH=/home/user/.usr/lib ./xxx.out
它的优点是不会更改其他所有内容的库路径。
【讨论】:
【参考方案2】:应该是LIBRARY_PATH
而不是LD_LIBRARY_PATH
。
gcc 检查LIBRARY_PATH
可以通过-v
选项查看
【讨论】:
LD_LIBRARY_PATH
不适用于 GCC,它适用于运行时库加载器(/lib/ld-linux.so.2 等)。可能根本没有安装 GCC,LD_LIBRARY_PATH
才能工作。以上是关于如何在 GCC Linux 中指定非默认共享库路径?运行时出现“加载共享库时出错”的主要内容,如果未能解决你的问题,请参考以下文章