在运行其他人开发的应用程序时,出现以下错误
./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文件。请帮我解决这个错误
答案 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
)。
你需要确保"当前"目录位于搜索路径下。如果通过编译器前端调用链接器,则可以在链接时使用链接器的-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 HowTo和Drepper's paper: How To Write Shared Libraries