加载共享库时出错:内部错误

加载共享库时出错:内部错误

我交叉编译了用于手臂跟随的 OpenCV本指南,并建造了这个示例程序

当我第一次像这样运行时:

./DisplayImage image.png

我有:

./DisplayImage:加载共享库时出错:
libopencv_highgui.so.3.1:无法打开共享对象文件:没有这样的文件或目录

所以我认为它需要图书馆libopencv_highgui.so.3.1。所以我将所有这些库添加到/lib

(1) libopencv_highgui.so
(2) libopencv_highgui.so.3.1
(3) libopencv_highgui.so.3.1.0

符号链接:(1) -> (2) -> (3)

但现在我得到:

./DisplayImage:加载共享库时出错:
lib/libopencv_highgui.so.3.1:内部错误

我运行了file库和可执行文件来检查它们的信息,这是输出:

.../opencv/platforms/linux/my_build/lib$ file libopencv_highgui.so.3.1.0
libopencv_highgui.so.3.1.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=1107ba22b36437bedb37dbfe0250626c14759be9, not stripped

.../opencv_sample$ file DisplayImage
DisplayImage: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=aef57fe79d0928ca3afdff8d1b65268e1ad72e77, not stripped

编辑:
运行readelf -d DisplayImage | grep NEEDED产生:

 0x00000001 (NEEDED)                     Shared library: [libopencv_highgui.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libopencv_imgcodecs.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libopencv_core.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x00000001 (NEEDED)                     Shared library: [ld-linux-armhf.so.3]

我发现他们都在我的目标上,除了ld-linux-armhf.so.3

是什么导致了这个“内部错误”问题?

答案1

编译二进制文件时,它可以使用共享库,这些库是带有版本号的引用,以便您获得受支持的库版本。

有时,您可以通过符号将较新的库链接到较旧的名称,二进制文件将尝试使用此名称。

但这并不意味着二进制文件将支持该版本。某些功能可能已更改,某些功能已删除或添加,等等。

因此,我建议针对较新的库版本重新编译二进制文件,在编译时将标记不兼容性。

您可以使用 ldd 查看库依赖关系。

例子;

$ ldd /bin/ls
    linux-vdso.so.1 (0x00007ffc65ff3000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9033f91000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9033bf1000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9033979000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9033771000)
    /lib64/ld-linux-x86-64.so.2 (0x0000558f25845000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9033551000)

编辑:ps ...您不能只跨库复制,因为它们有自己的依赖项。您的交叉编译机器将需要类似的库版本来进行编译。

相关内容