- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 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 ...
您需要了解几件事:
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
的共享库链接>.
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/
如何以一种方式链接二进制文件以与两个现有版本的库兼容,这两个版本具有冲突的 SONAME ?这两个版本不共享相同的 SONAME 前缀。一个是 libcapi10.so.3,另一个是 libcapi1
我正在尝试在 64 位 Ubuntu 12.04 上构建 SLitrani。我已经从源代码构建了 ROOT 5.34.03,我确实弄清楚了如何为 $ROOTDEV 设置 LD_LIBRARY_PATH
如果我创建一个没有像这样的 SONAME 的共享库 gcc -shared libfoo.o -o libfoo.so 并链接到它, 链接器如何找到我的共享库? 是文件名libfoo.so被链接器视为
我正在编译 sipXtapi,我需要用这一行编译 gcc -shared -DPIC .libs/codec_pcmapcmu_la-CodecPcmaWrapper.o .libs/codec_
我制作了一个程序,它使用两个共享库(我编译的)并且放置如下: /home_directory_where_I_compile_and_run_everything -->/lib/libjson_li
我已经编写了一个共享对象来修改 FreeType 的 FT_Load_Glyph 和 FT_Render_Glyph 函数的参数,目前通过将其插入 LD_PRELOAD 和 dlsym。 这工作正常,
我学会了“ Program Library HOWTO ”。它提到使用 soname 来管理版本,如下所示。 gcc -shared -fPIC -Wl,-soname,libfoo.so.1 -o
我正在为一个库制作一个 Debian 包,我称之为 libmystuff。目前版本为 4.0.0,下一个版本将是 4.1.0,并且可能会破坏 API 兼容性。该项目使用 CMake 构建。 这在 so
我正在使用 eclipse cdt 来编译和运行 C++ 应用程序。 My_main_program 特别需要 libjpeg.so.62。 我的 Ubuntu 系统以前在 /usr/local/li
我正在使用 Cmake for Android(使用 Android NDK)编译 libclang。 这是配置文件名和soname的CMake配置部分: set_target_properties(
我想从不同平台上的源代码构建Boost。我已经能够在linux上(在docker镜像上)做到这一点。我也可以在自己的计算机(Mac OS X 10.13 Xcode 9.4.1)上执行此操作,但是当我
我正在尝试在 mysql 5.5 中安装半同步复制并尝试执行以下命令: 安装插件“rpl_semi_sync_master”SONAME“semisync_master.so” 但是这个命令抛出以下错
我正在尝试使用 cmake 构建一个 rpm 包。这个包构建了一个库并将其打包好,一切都是 hunky-dory 在下一次迭代中,我使用以下命令添加“soname” set_property(TARG
据我了解,“/lib/ld-linux.so.2”中的“2”很少更改。有不能与新库一起工作的旧程序,也有不能与旧库一起工作的新程序。但它们都引用/lib/ld-linux.so.2,从而阻止安装这两个
我尝试在 Mac OS X 上使用 CMake 构建我的应用程序,但出现以下错误: Linking CXX shared library libsml.so ld: unknown option: -
我正在用 cmake android 交叉编译 gdcm,直到编译结束,但最后我得到以下错误。你们如何在编译库时在 cmake-gui 或 cmake 中设置 -soname,这样我们就可以避免以下类
我是一名优秀的程序员,十分优秀!