我正在使用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和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的符号链接是否正确。 请帮忙!
答案 0 :(得分:2)
我可以建立这个项目。问题是动态链接器一直在搜索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
或其他任何名称。如果图书馆有SONAME
libbar.so.7
,则可执行文件将需要libbar.so.7
,无论[1]如何。关于你的问题。您的可执行文件无法加载libjpeg.so.9
,因此我们得出结论,它正在与具有SONAME: libjpeg.so.9
的共享库链接(在构建时)。
我删除了所有libjpeg。*并安装了libjpeg.so.62
您不能删除在可执行 build 时使用的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.so.9
实际上,不,我不是。但这次我会说得对。
正在发生的事情是您的可执行文件正确记录NEEDED: libjpeg.so.62
(您可以使用以下命令验证这一点:readelf -d /path/to/exe | grep 'NEEDED.*libjpeg'
)。
但是还还有一些其他共享库(ldd
输出中列出的一个),其未已重建,但仍然有依赖于libjpeg.so.9
。
您可以在readelf -d /path/to/libXXX.so | grep 'NEEDED.*libjpeg\.so\.9'
输出中列出的所有库上运行ldd
来找到该库。
找到后,您将不得不重建它,因此它还取决于libjpeg.so.62
。