如何在 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 中指定非默认共享库路径?运行时出现“加载共享库时出错”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sed 中指定非捕获组?

如何在 pip 命令中指定 gcc 路径?

gcc找不到静态库中的函数

如何把文件加入linux系统中

Linux Make问题

如何指定GCC的默认头文件路径