Compilé OpenCV para seguir el brazoesta guíay construí estoprograma de muestra.
Cuando lo ejecuté por primera vez así:
./DisplayImage image.png
Obtuve:
./DisplayImage: error al cargar bibliotecas compartidas:
libopencv_highgui.so.3.1: no se puede abrir el archivo de objeto compartido: no existe tal archivo o directorio
Entonces pensé que necesitaba la biblioteca libopencv_highgui.so.3.1
. Entonces agregué todas estas bibliotecas a /lib
:
(1) libopencv_highgui.so
(2) libopencv_highgui.so.3.1
(3) libopencv_highgui.so.3.1.0
enlaces simbólicos: (1) -> (2) -> (3)
Pero ahora obtengo:
./DisplayImage: error al cargar bibliotecas compartidas:
lib/libopencv_highgui.so.3.1: error interno
Ejecuté file
tanto la biblioteca como el ejecutable para verificar su información, y este es el resultado:
.../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
editar:
Correr readelf -d DisplayImage | grep NEEDED
produce:
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]
Los encontré a todos en mi objetivo excepto ld-linux-armhf.so.3
.
¿Qué podría estar causando este problema de "error interno"?
Respuesta1
cuando se compila un binario, puede usar bibliotecas compartidas, estas bibliotecas son referencias con un número de versión para que pueda obtener una versión de biblioteca compatible.
a veces puedes salirte con la tuya vinculando sym una biblioteca más nueva a un nombre más antiguo, el binario intentará usar este.
sin embargo, esto no significa que el binario admitirá esa versión. Es posible que algunas funciones hayan cambiado, algunas funciones se hayan eliminado o agregado, etc.
Por lo tanto, sugeriría volver a compilar el binario con una versión más nueva de la biblioteca; se marcarán incompatibilidades en el momento de la compilación.
puedes ver las dependencias de la biblioteca usando ldd.
Ejemplo;
$ 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)
Editar: ps... no puedes simplemente copiar entre bibliotecas ya que tienen sus propias dependencias. su máquina de compilación cruzada necesitará versiones de biblioteca similares para compilar.