无法加载共享库:libxerces.so

Unable to load shared library : libxerces.so

本文关键字:libxerces so 共享 加载      更新时间:2023-10-16

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

./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

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

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

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

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

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

LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH  ./appln

当添加新的"本地系统"库(例如在/usr/local/lib/中)时,最好在/etc/ld.so.conf中添加一次该目录(/usr/local/lib/),并且应该运行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的论点,但我真的不喜欢。

另请阅读程序库HowTo和Drepper的论文:如何编写共享库