我可以构建这个项目。问题在于动态链接器一直在搜索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
。