我交叉编译了用于手臂跟随的 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 ...您不能只跨库复制,因为它们有自己的依赖项。您的交叉编译机器将需要类似的库版本来进行编译。