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

时间:2012-01-12 12:29:24

标签: gcc linker shared-libraries

有一台我没有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位于那里。

我的无线假设是在调用xxx.out时未搜索~/.usr/lib。 但我该怎么做才能指定.so的路径,以便xxx.out可以查找.so文件?

添加是当我将-static提供给gcc时,会发生另一个错误:

undefined reference to `function_proviced_by_the_very_librar'

即使.so-L被赋予gcc,似乎-l无关紧要。 如何用该库构建可用的exe?


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

我发现了a useful article at tldp

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

1 个答案:

答案 0 :(得分:90)

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

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

,其优点是不会更改其他所有内容的库路径。