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

Jok*_*ter 56 linker gcc shared-libraries

有一台笔记本电脑,我没有root权限.

在机器上我安装了一个库configure --prefix=$HOME/.usr.

之后,我收到了以下文件~/.usr/lib:

libXX.so.16.0.0
libXX.so.16
libXX.so
libXX.la
libXX.a
Run Code Online (Sandbox Code Playgroud)

当我编译一个程序,该程序使用此命令调用库提供的函数之一: 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'
Run Code Online (Sandbox Code Playgroud)

.so即使-L并且-l给予gcc 似乎也无所谓.我该怎么做才能用该库构建一个可用的exe?


对于与我有同样问题的其他人

在tldp找到了一篇有用的文章.

它引入了静态/共享/动态加载库,以及一些使用它们的示例代码.

pel*_*lya 96

有两种方法可以实现这一目标:

  • 使用-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
Run Code Online (Sandbox Code Playgroud)

这样做的好处是不会改变其他所有的库路径.


小智 5

应该LIBRARY_PATH代替LD_LIBRARY_PATH。gcc检查LIBRARY_PATH哪些可以通过-v选项查看

  • LD_LIBRARY_PATH不适用于GCC,适用于运行时库加载器(/lib/ld-linux.so.2等)。要使“ LD_LIBRARY_PATH”正常工作,可能根本没有安装GCC。 (6认同)