运行时加载的共享库的soname错误Ubuntu

3

我正在使用Eclipse CDT编译和运行C++应用程序。

我的主程序需要特别的libjpeg.so.62库。

我的Ubuntu系统之前在/usr/local/lib/目录下有libjpeg.so.9。我曾经使用libjpeg.so.9编译并运行过,但在运行时出现了兼容性错误。

于是我删除了所有的libjpeg.*文件,并从源代码安装了libjpeg.la、libjpeg.so、libjpeg.so.62和libjpeg.so.62.0.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.62。 - user3077759
可执行文件的ldd显示为“libjpeg.so.62 => /usr/local/lib/libjpeg.so.62 (0xb74af000)” - user3077759
libjpeg.so.62 已经在 /usr/local/lib/ 目录下。 - user3077759
我认为Eclipse CDT在运行时知道要上传哪个版本。我怀疑符号链接或共享库名称卡住了。但是我不知道如何解决这个问题。 - user3077759
http://help.eclipse.org/indigo/index.jsp?topic=/org.eclipse.cdt.doc.user/reference/cdt_u_prop_general_pns_libpath.htm - user2485710
显示剩余2条评论
1个回答

4
我可以构建这个项目。问题在于动态链接器一直在搜索libjpeg.so.9并抛出异常。
'error while loading shared libraries: libjpeg.so.9: ... No such file ...

你需要了解以下几点:
1.共享库可能具有SONAME动态标签(可以使用readelf -d foo.so | grep SONAME进行查看)。
2.如果可执行文件链接到这样的一个库,那么不论库本身被称为什么名称,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(其他地方使用),那个库仍然具有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.so.9。
实际上,我之前说错了,但这次我会正确的。发生的情况是,你的可执行文件正确记录了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


我已经检查了libjpg.so,并且它给出了以下信息:readelf -d /usr/local/lib/libjpeg.so | grep SONAME 0x0000000e (SONAME) 库soname: [libjpeg.so.62] 这意味着libjpeg.so指向了正确的.so.major。 - user3077759
我还检查了ldd可执行文件,它返回libjpeg.so.62 => /usr/local/lib/libjpeg.so.62 (0xb76ff000)。因此,看起来可执行文件也记录了正确的soname。我不知道是什么导致了我的问题。 - user3077759
谢谢。你是对的。ldd可执行文件显示包括libjpeg.so.62和libjpeg.so.9,尽管我没有包括libjpeg.so.9。我该如何从可执行文件中删除libjpeg.so.9? - user3077759

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接