无法加载共享库:libxerces.so

时间:2014-09-02 07:37:52

标签: c++ g++ shared-libraries

在运行其他人开发的应用程序时,出现以下错误

./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文件。请帮我解决这个错误

4 个答案:

答案 0 :(得分:3)

您需要将libxerces-c.so放在库路径中的某个位置。可能不会搜索当前文件夹的库。尝试将其放入/usr/local/lib

答案 1 :(得分:2)

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

LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH  ./appln

答案 2 :(得分:2)

显然"当前文件夹"不在您的可执行文件使用的运行时搜索路径中。我假设您使用的是Linux(linux-gate.so.1)。

你需要确保&#34;当前&#34;目录位于搜索路径下。如果通过编译器前端调用链接器,则可以在链接时使用链接器的-rpath选项(也接受-R)或-Wl,-rpath,<dir>来执行此操作。这会嵌入一个搜索路径,以便在运行时用于您的程序。

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

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

答案 3 :(得分:2)

添加新的&#34;本地系统&#34;库(例如在/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