gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:17:51 26 4
gpt4 key购买 nike

我正在使用 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 并抛出

'加载共享库时出错:libjpeg.so.9:无法打开共享对象文件:没有这样的文件或目录'

在运行时。这个问题快要死了。我检查过 libjpeg.so 的符号链接(symbolic link)是否正确。请帮忙!

最佳答案

I can build the project. The problem is the dynamic linker keeps searching for libjpeg.so.9 and throwing

'error while loading shared libraries: libjpeg.so.9: ... No such file ...

您需要了解几件事:

  1. 共享库可能有 SONAME 动态标签(通过 readelf -d foo.so | grep SONAME 可见)。
  2. 如果可执行文件链接到此类库,SONAME 将被记录为NEEDED 动态标记(在可执行文件中),无论如何库本身的名称。也就是说,您可以将库命名为 foo.sofoo.so.1234 或任何其他名称。如果库具有 libbar.so.7SONAME,那么可执行文件将需要 libbar.so.7,无论是什么 [1] .

关于你的问题。您的可执行文件无法加载 libjpeg.so.9,因此我们得出结论,它正在(在构建时)与具有 SONAME: libjpeg.so.9 的共享库链接>.

I deleted all libjpeg.* and installed libjpeg.so.62

您不能删除在可执行构建 时使用的 libjpeg.so(在 /usr/local/lib 以外的地方)。 那个 库仍然有 SONAME: libjpeg.so.9,这让你很伤心。

您可以通过在链接行上传递 -Wl,-t 标志来找出在链接时正在使用哪些库。

[1] 不完全正确:如果可执行文件不需要来自 foo.so 的任何符号,并且如果 --as-needed 链接器选项有效, 那么 NEEDED: libbar.so.7 终究不会被记录下来。

更新:

I have also check ldd executable and it returns libjpeg.so.62

这意味着您运行 ldd 的可执行文件是正确的,但实际运行 的可执行文件不是,它们必须是不同的可执行文件。

更新 2:

You're right. ldd executable shows both libjpeg.so.62 and libjpeg.so.9 are included

实际上,不,我不是。但这次我会是对的。

发生的事情是您的可执行文件正确记录了 NEEDED: libjpeg.so.62(您可以使用以下命令验证这一点:readelf -d/path/to/exe | grep '需要。*libjpeg').

但您有一些其他共享库(ldd 输出中列出的共享库之一),重建,并且仍然依赖于 libjpeg.so.9

您可以通过运行 readelf -d/path/to/libXXX.so | 找到该库。 grep 'NEEDED.*libjpeg\.so\.9'ldd 输出中列出的所有库上。

一旦找到它,就必须重建它,因此它也依赖于 libjpeg.so.62

关于linux - 在运行时 Ubuntu 加载共享库的错误 soname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20443110/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com