我正在使用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)
答案 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
这对我来说就像是一种魅力。