【问题标题】:C program linking with shared library without setting LD_LIBRARY_PATHC 程序与共享库链接而不设置 LD_LIBRARY_PATH
【发布时间】:2012-07-08 17:54:42
【问题描述】:

我正在阅读 GCC 简介,它说一个包是否同时具有 .a 和 .so。 gcc 更喜欢共享库。默认情况下,加载程序仅在一组预定义的系统目录中搜索共享库,例如/usr/local/lib/usr/lib。如果库不在这些目录之一中,则必须将其添加到加载路径,或者您需要使用-static 选项强制它使用 .a 库。但是,我尝试了以下方法:

vim hello.c:

#include <gmp.h>
#include <stdio.h>

int main() {
        mpz_t x;
        mpz_init(x);
        return 0;
}

gcc hello.c -I/opt/include -L/opt/lib -lgmp  (my gmp library is in opt)
./a.out

它运行。书上说应该有以下错误:

./a.out: error while loading shared libraries:
libgdbm.so.3: cannot open shared object file:
No such file or directory

(嗯,这本书以 GDBM 为例,但我使用了 GMP,但这无所谓吧?)

但是,我没有设置LD_LIBRARY_PATH=/opt/lib,正如你所见,我也没有使用-static 选项,但a.out 仍然运行。

你们能告诉我为什么并告诉我如何得到书中描述的错误吗?是的,我想要这个错误,所以我会理解我误解了什么。

【问题讨论】:

  • 您是否 100% 确定 /usr/lib 中没有 libgmp?另外,请确保/etc/ld.so.conf 中没有/opt/lib 的条目。
  • 另外,请确保您的LD_LIBRARY_PATH 没有为您设置。使用LD_LIBRARY_PATH= 取消设置(= 之后没有任何内容)。
  • 我使用 echo LD_LIBRARY_PATH 来验证它已经是空的。谢谢!此外,我之前确实将库安装在 /usr/local 下(作为学习的一种方式),但我已经将它们全部删除并再次安装到 /opt/。感谢大家的热心帮助
  • ldd 在您的a.out 上的输出是什么样的?
  • linux-gate.so.1 => (0xb7746000) libgmp.so.10 => /usr/lib/i386-linux-gnu/libgmp.so.10 (0xb76c5000) libc.so. 6 => /lib/i386-linux-gnu/libc.so.6 (0xb7520000) /lib/ld-linux.so.2 (0xb7747000) 谢谢

标签: c gcc compiler-construction


【解决方案1】:

您对我的评论的回复:

linux-gate.so.1 => (0xb7746000)
libgmp.so.10 => /usr/lib/i386-linux-gnu/libgmp.so.10 (0xb76c5000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7520000)
/lib/ld-linux.so.2 (0xb7747000) 

所以,您的程序正在从 /usr/lib 获取库。

您可以尝试重命名 /opt/lib 中的库,并链接到新名称。

mv /opt/lib/libgmp.so /opt/lib/libgmp-test.so
gcc hello.c -I/opt/include -L/opt/lib -lgmp-test

然后尝试运行程序。此外,将ldd 的结果与新的a.out 与您之前得到的结果进行比较。

【讨论】:

  • 好的.. 谢谢。但是你能告诉我如何让它从 /opt/ 而不是 /usr/lib 中获取库吗?这真的让我感到困惑,因为在 GMP 文档中它说如果你执行“make install”,它将被安装到 /usr/local/lib 但我执行了“make install -prefix=/opt”,现在它正在接受/usr/lib 中的库...
  • 我将它重命名为 libgmpt.so,然后我做了“gcc hello.c -I/opt/include -L/opt/lib -lgmpt”。但它仍然从 /usr/lib/ 中获取,并且 a.out 仍然运行没有错误。好吧,我想我已经花了太多时间试图理解这一点。我不知道。也许我应该继续阅读并将其放在一边?
  • @ZesenHuang:你在a.out上的ldd现在说什么?
  • 我已经尝试过 gmp_randinit_default 和 gmp_randseed_ui。相同的故事。非常感谢您的帮助
  • @ZesenHuang:感谢您接受我的回答,对您的问题 +1。
猜你喜欢
  • 2014-09-08
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多