如何在 GCC Linux 中指定非默认的共享库路径? 运行时出现“加载共享库时出错”

有一台笔记本电脑,我没有根特权。

我用 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

Out 是在没有任何警告的情况下生成的,但是当我运行它时,出现了这样的错误:

./xxx.out: error while loading shared libraries: libXX.so.16: cannot open shared object file: No such file or directory虽然 libXX.so.16在那里。

我的无线索假设是在调用 xxx.out 时没有搜索 ~/.usr/lib。 但是我能做什么来指定路径。所以,为了让 xxx.out 可以在那里找到。那么文件呢?

另外,当我将 -static提供给 gcc 时,会发生另一个错误,如下所示:

undefined reference to `function_proviced_by_the_very_librar'

看起来 .so并不重要,即使 -L-l给了 gcc。 我应该怎么做才能用这个库构建一个可用的 exe 呢?


对于其他和我有同样问题的人来说

我找到了 一篇有用的文章

它介绍了静态/共享/动态加载库以及使用它们的一些示例代码。

144905 次浏览

有两种方法可以做到这一点:

  • 使用 -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

它的优点是不会为其他任何事情更改库路径。

应该是 LIBRARY_PATH而不是 LD_LIBRARY_PATH吗。 Gcc 检查 LIBRARY_PATH,这可以通过 -v选项看到