【问题标题】:How to specify non-default shared-library path in GCC Linux? Getting "error while loading shared libraries" when running如何在 GCC Linux 中指定非默认共享库路径?运行时出现“加载共享库时出错”
【发布时间】: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 关于这个。

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

【问题讨论】:

    标签: gcc linker shared-libraries


    【解决方案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 才能工作。
      猜你喜欢
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2011-05-29
      相关资源
      最近更新 更多