加载共享库时出错

时间:2010-12-23 00:40:30

标签: shared-libraries shared

我正在使用g ++编译器在Ubuntu上运行eclipse,我正在尝试运行一个使用xerces的示例程序。

构建没有产生任何错误,但是当我试图运行程序时,我会收到此错误:

  

error while loading shared libraries: libxerces-c-3.1.so: cannot open shared object file: No such file or directory

libxerces-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 个答案:

答案 0 :(得分:24)

尝试以root身份运行ldconfig以查看它是否解决了问题。

答案 1 :(得分:4)

我将/ opt / lib中的所有库文件复制到/ usr / lib中,程序现在正常工作。谢谢你的回复。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

有很多方法可以做到这一点,这里已经提到了很多。但是,您希望避免意外将库文件复制到系统中/通过系统。这很容易做到,因为人们几乎没有想象为他们的图书馆制作原始的唯一名称。

所以有几件事要考虑:

  • 您是否需要将这些文件作为系统的永久部分?
  • 您是否只需安装进行测试和频繁更新?
  • 你只需要它们一次或两次运行那个特定命令吗?
  • 您的本地图书馆在哪里?

要查找系统上的各种库位置(除了使用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

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

答案 4 :(得分:1)

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

 sudo apt-get install libxerces-c3.1

这对我来说就像是一种魅力。