错误:加载共享库失败

22
我在Ubuntu上使用g++编译器运行eclipse,尝试运行一个利用xerces的示例程序。构建没有出现错误,但是当我尝试运行程序时,出现以下错误:error while loading shared libraries: libxerces-c-3.1.so: cannot open shared object file: No such file or directorylibxerces-c-3.1.so位于目录/opt/lib中,我已经将其作为库包含在eclipse中。当我检查该文件夹时,文件确实存在。当我执行echo $LD_LIBRARY_PATH时,也列出了/opt/lib。 有任何想法解决问题吗?谢谢。 ldd libxerces-c-3.1.so命令输出如下:
linux-vdso.so.1 =>  (0x00007fffeafff000)
libnsl.so.1 => /lib/libnsl.so.1 (0x00007fa3d2b83000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fa3d2966000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fa3d265f000)
libm.so.6 => /lib/libm.so.6 (0x00007fa3d23dc000)
libc.so.6 => /lib/libc.so.6 (0x00007fa3d2059000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fa3d1e42000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa3d337d000)

5个回答

33

尝试以root身份运行ldconfig,看是否可以解决问题。


3
我尝试运行 sudo ldconfig,但它仍然不起作用。 - Nubcake
当然没有,@Nubcake。以 root 身份执行以下命令 echo /opt/lib > /etc/ld.so.conf.d/my-bonus-library-path.conf 或者适用于你的情况的等效命令,然后运行 ldconfigld.so 需要知道在哪里查找库文件,并使用缓存,ldconfig 会重建该缓存。 - ulidtko

4
有很多方法可以做到这一点,大部分已在此处提到。但是你需要避免意外地将你的库文件复制到/覆盖系统文件中。由于人们在为其库创建原始独特名称方面缺乏想象力,这很容易做到。
所以有几件事需要考虑:
  • 您需要这些文件成为系统的永久部分吗?
  • 您只需要安装进行测试和频繁更新吗?
  • 您只需要它们运行那个特定命令一两次吗?
  • 您的本机库在哪里?
要查找系统上各种库位置(除了使用find之外),请看这里:
cat /etc/ld.so.conf    
cat /etc/ld.so.conf.d/*

在Linux上有一些标准位置:

/lib            # for base system (don't use this!)
/usr/lib        # for package manger installed apps 
/usr/local/lib  # for user installed apps

还有很多其他的地方,但你最好还是使用/usr/local/lib

接下来,您需要告诉系统在哪里找到这些库。使用ldconfig是一个厉害的系统方法(谁知道他在做什么),但如果您在这里出错可能会后悔。使用这个命令最安全的方法是使用标志-v -n,以使命令详细,并且指定需要添加的库目录。

sudo ldconfig -v -n /usr/local/lib/your-uber-libs

已完成。但如果您只是想测试一些东西,那么最好直接从命令行使用您的LD_LIBRARY_PATH,像这样:

LD_LIBRARY_PATH=/usr/local/lib/your-uber-libs ./your_uber_command

或者,将以下内容添加到您的 .bashrc 脚本中。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/your-uber-libs

现在,您可以运行动态链接的命令。

2
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<your_lib_path> 帮助我解决了这个问题。 - Aadishri

4
执行 ldd libxerces-c-3.1.so 并检查输出以查看是否可以找到所有依赖项。

1
我已经使用ldd命令的结果编辑了这个主题。我对Linux还比较陌生,所以不太确定输出的含义。我怎么知道我是否拥有所有所需的共享库?那些箭头指向的是那些库吗? - user459811

3
我将/opt/lib目录下的所有库文件复制到了/usr/lib中,程序现在可以正常运行。感谢您的回复。

2

尝试安装库libxerces-c3.1。使用下面提到的命令来安装库。

 sudo apt-get install libxerces-c3.1

这对我非常有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接