无法加载共享库:libxerces.so

问题描述:

运行应用程序时由其他人开发的,得到以下错误无法加载共享库:libxerces.so

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

如果我运行ldd命令:

# ldd appln 
linux-gate.so.1 => (0x00e20000) 
libdl.so.2 => /lib/libdl.so.2 (0x00a61000) 
libxerces-c.so.28 => not found 

我已经有了当前文件夹中的libxerces-c.so.28文件。请帮助我如何解决该错误

您需要将libxerces-c.so放在库路径的某处。可能当前文件夹不会搜索库。尝试把它放在/usr/local/lib

+0

现在我发现它已经存在在/ usr/local/lib目录,但仍然得到错误 – 2014-09-02 07:42:48

+0

或只是做了'须藤让install'如果你有建立它(或'sudo ldconfig') – sop 2014-09-02 07:50:18

默认情况下.so文件不在当前文件夹中搜索(它们应该在/ usr/lib等)。 要增加当前目录中。所以查找使用:

LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH ./appln 
+0

$ LD_LIBRARY不存在于我的redhat linux – 2014-09-02 07:48:16

+0

对不起,我犯了一个错字,现在已经更正了。 – glezmen 2014-09-02 07:50:11

显然“当前文件夹”是不是由你的可执行文件使用的运行时搜索路径。我假设你在linux上(linux-gate.so.1)。

您需要确保“当前”目录在搜索路径下。如果您通过编译器前端调用链接程序,则可以在链接时使用链接器的-rpath选项(也接受-R)或-Wl,-rpath,<dir>来在链接时执行此操作。这将在运行时将嵌入的搜索路径嵌入到您的程序中。

尽管如此,请考虑如何安装程序。添加特定于您的开发环境的路径没有任何意义。您可能需要考虑使用$ORIGIN$ORIGIN相对路径,它告诉运行时链接程序在包含(或相对于)可执行文件的位置中查找共享对象。您应该始终避免将.添加到运行时搜索路径;根据调用它的进程的当前目录,你的程序不应该有不同的表现。

作为一种临时措施,您可以设置环境变量LD_LIBRARY_PATH来覆盖嵌入式和系统搜索路径,但依靠LD_LIBRARY_PATH覆盖进行最终安装通常是一个坏主意。

+0

我正在使用redhat enterprise linux,我需要执行的完整命令是什么 – 2014-09-02 07:47:07

+0

@RajeshKumar:我不知道你需要执行的copmlete命令是什么,因为我不知道你现在如何链接你的可执行文件。 – 2014-09-02 07:49:52

当(在/usr/local/lib/如)你最好添加目录(/usr/local/lib/)曾经在你的/etc/ld.so.conf,你应该运行ldconfig更新链接器缓存(每次添加内/usr/local/lib/一些时间)

增加新的“本地系统”库

ldconfig(8)ld.so(8)ldd(1)dlopen(3)

如果你想自己的库,设置LD_LIBRARY_PATH包含他们的目录(如$HOME/lib/和标准目录,例如

export LD_LIBRARY_PATH=$HOME/lib:/usr/lib:/usr/local/lib 

~/.bashrc(但我不喜欢那个混乱的做法,并希望自行管理我的/usr/local/lib/)。

你也可以使用一些-Wl,-rpath argument但我真的不喜欢这一点。

阅读也Program Library HowToDrepper's paper: How To Write Shared Libraries

+0

这个答案我最喜欢。 – 2014-09-02 09:15:36