Error al cargar bibliotecas compartidas: error interno

Error al cargar bibliotecas compartidas: error interno

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é filetanto 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 NEEDEDproduce:

 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.

información relacionada