加载共享库时出错:libsigc-2.0.so与libsigc-2.0.so.0

时间:2018-09-20 17:42:10

标签: linux

我正在构建一个使用libsigc-2.0(-lsigc-2.0)的应用程序

我遇到运行时错误,因为应用程序找不到libsigc-2.0.so.0

error while loading shared libraries: libsigc-2.0.so.0: cannot open shared object file

但是,我的系统只有libsigc-2.0.so:

ls /usr/lib64/libsigc*
/usr/lib64/libsigc-2.0.so

我的程序在哪里选择 .0 !!

我有两种理论,但我不知道如何有效地测试它们:

  • 我的libsigc-2.0.so实际上是一个libsigc-2.0.so.0,因此以某种方式在我的代码中注入了依赖项
  • 另一个藏在某个地方的图书馆。再一次,我做了一个 find ,却什么都没出现
  • 我使用的其中一个图书馆或档案馆具有这种依赖性

如果我添加libsigc-2.0.so.0,我可以解决此问题,但这对我来说就像是黑客(我不知道发生了什么)

编辑1 感谢您的建议。按照预期使用ldd后,可执行文件已绑定到libsigc-2.0.so.0,但在运行时找不到它

libsigc-2.0.so.0 => not found 

使用LD_DEBUG = all,显示所有要加载的路径。在任何一个文件中均未找到libsigc-2.0.so.0(但找到了libsigc-2.0.so)

最后,使用-v抛出了很多库路径(-L),我编写了一个脚本来查找所有路径中的libsigc-2.0.so.0,但没有显示(同样,libsigc-2.0。也是如此)。

这是最后显示的链接命令(我使用的是Intel编译器-> icpc):

icpc -m64 -gcc -o convert.linux-intel O.linux-intel/convert.o 
-L/pathToProject/Executive/lib/linux-intel -lExecutive 
-L/home/nhcuzot/projects/3.1/dev/Ports/lib/linux-intel -lStdPorts -Wl,-E 
-L/pathToProject/util/linux-intel/lib 
-lantlr -lnewmat -ledit_64 -lncurses 
/pathToProject/util/linux-intel/lib/libcrypto.a 
/pathToProject/util/linux-intel/lib/libssl.a 
-pthread -lsigc-2.0 -L/pathToProject/lib 
-L/pathToIntelCompiler/ -lifcore -lncurses -lm -ldl -v 

2 个答案:

答案 0 :(得分:1)

首先,有关ELF可执行文件中动态链接如何工作的一些基础知识:在链接时,链接到的每个共享库都有一个SONAME参数,该参数被复制到最终可执行文件的NEEDED条目中。然后,在动态链接时,递归处理每个可执行文件和动态库的NEEDED条目,以确定哪些文件需要加载到内存中。 (这样做的原因是,您可以链接到libncurses.so,这是到真实库的符号链接;但是在生成的可执行文件中,它嵌入了有关“兼容版本”的信息,例如libncurses.so.5libncurses.so.6。然后,在动态链接时,动态链接程序/lib64/ld-linux-x86-64.so.2会查看这些NEEDED条目,以确定是否需要将libncurses.so.5libncurses.so.6加载到内存-这通常也是指向实际库的符号链接,例如libncurses.so.5.9libncurses.so.6.1

现在,要查看任何给定的ELF对象的依赖性信息,可以使用binutils中的objdump实用程序:

objdump -p /usr/lib64/libsigc-2.0.so | grep -E 'SONAME|NEEDED'

大概,这应该表明SONAME项是libsigc-2.0.so.0。如果是这样,则表明该库软件包的安装已损坏。解决此问题的几种方法是:

  • 使用包装系统重新安装适当的包装。例如,根据/usr/lib64路径,很可能您正在使用基于YUM / RPM的发行版。因此,您可能想使用(未经测试的)libsigc-2.0.so.0,然后使用yum whatprovides '*/libsigc-2.0.so.0(显然是用实际的包名代替{)来搜索本应包含sudo yum reinstall libsigc符号链接的包。 {1}}。
  • 运行libsigcsudo ldconfig工具根据动态链接程序搜索路径中的ldconfig个库条目重新创建丢失的符号链接,并从{{1}中包含的基本文件名中更新包含地图的SONAME文件。 }}到完整文件路径的条目。但是,这样做有一个缺点,/etc/ld.so.cache不能总是正确地猜测丢失的符号链接应该指向的位置,这就是为什么我希望首先尝试重新安装发行版的库软件包的原因。

答案 1 :(得分:1)

尝试安装以下依赖项。

sudo apt-get install --reinstall libcairomm-1.0-1v5 libglibmm-2.4-1v5 \
libsigc++-2.0-0v5