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