我正在使用eclipse-cdt编译和运行C++应用程序。
My_main_program特别需要libjpeg.so.62.
我的Ubuntu系统以前在/usr/local/lib/
上有libjpeg.so.9。在出现运行时兼容性错误之前,我碰巧使用libjpeg.so.9编译并运行。
然后,我删除了所有libjpeg.*,并从源代码中安装了libjpeg.la、libjpeg.so、libjpeg.so.62和libjpegso.62.0。然后我运行ldconfig。
我可以建立这个项目。问题是动态链接器一直在搜索libjpeg.so.9并抛出
'error while loading shared libraries: libjpeg.so.9: cannot open shared object file: No such file or directory'
在运行时。这个问题正在折磨我。我已经检查了libjpeg.so的符号链接是否正确。请帮忙!
我可以建立这个项目。问题是动态链接器一直在搜索libjpeg.so.9并抛出
'error while loading shared libraries: libjpeg.so.9: ... No such file ...
您需要了解以下几点:
- 共享库可以具有
SONAME
动态标签(用readelf -d foo.so | grep SONAME
可见) - 如果可执行文件链接到这样的库,则
SONAME
被记录为NEEDED
动态标记(在可执行文件中),而不管库本身被称为什么。也就是说,您可以将库命名为foo.so
、foo.so.1234
或其他任何名称。如果库具有libbar.so.7
中的SONAME
,那么可执行文件将需要libbar.so.7
,无论[1]如何
关于你的问题。您的可执行文件无法加载libjpeg.so.9
,因此我们得出结论,它正在与具有SONAME: libjpeg.so.9
的共享库链接(在构建时)。
我删除了所有libjpeg.*并安装了libjpeg.so.62
您一定没有删除可执行构建时使用的libjpeg.so(位于/usr/local/lib
之外的其他位置)那个库仍然有SONAME: libjpeg.so.9
,这让你很伤心。
您可以通过在链接行上传递-Wl,-t
标志来了解链接时正在使用哪些库。
[1] 不完全正确:如果可执行文件不需要来自foo.so
的任何符号,并且如果--as-needed
链接器选项有效,那么NEEDED: libbar.so.7
将不会被记录。
更新:
我还检查了ldd可执行文件,它返回libjpeg.so.62
这意味着运行ldd
的可执行文件是正确的,但实际运行的可执行程序不是,它们必须是不同的可执行代码。
更新2:
你说得对。ldd可执行文件显示libjpeg.so.62和libjpeg.se都包含在中
事实上,不,我没有。但这次我会对的。
实际情况是,您的可执行文件正确记录了NEEDED: libjpeg.so.62
(您可以使用以下命令进行验证:readelf -d /path/to/exe | grep 'NEEDED.*libjpeg'
)。
但是也有一些其他共享库(ldd
输出中列出的库之一),该库已重建而不是,并且仍然依赖于libjpeg.so.9
。
您可以通过在ldd
输出中列出的所有库上运行readelf -d /path/to/libXXX.so | grep 'NEEDED.*libjpeg.so.9'
来查找该库。
一旦你找到它,你就必须重建它,所以它也依赖于libjpeg.so.62
。