Erro ao carregar bibliotecas compartilhadas: erro interno

2

Eu compilei o OpenCV para o braço seguindo este guia e criei este exemplo de programa .

Quando eu corri assim pela primeira vez:

./DisplayImage image.png

Eu tenho:

./DisplayImage: error while loading shared libraries:
libopencv_highgui.so.3.1: cannot open shared object file: No such file or directory

Então imaginei que precisa da biblioteca libopencv_highgui.so.3.1 . Então, adicionei todas essas libs a /lib :

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

links simbólicos: (1) - > (2) - > (3)

Mas agora estou chegando:

./DisplayImage: error while loading shared libraries:
lib/libopencv_highgui.so.3.1: internal error

Eu executei file na biblioteca e no executável para verificar suas informações, e esta é a saída:

.../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

edit:
A execução de readelf -d DisplayImage | grep NEEDED produz:

 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]

Encontrei todos eles no meu alvo, exceto ld-linux-armhf.so.3 .

O que poderia estar causando esse problema de "erro interno"?

    
por Alaa M. 30.10.2016 / 16:35

1 resposta

1

quando um binário é compilado, ele pode usar bibliotecas compartilhadas, essas bibliotecas são referências com um número de versão para que você atinja uma versão de biblioteca que seja suportada.

às vezes você pode sair com sym ligando uma nova biblioteca a um nome antigo, o binário tentará usar essa.

no entanto isso não significa que o binário irá suportar essa versão. Algumas funções podem ter mudado, algumas funções removidas ou adicionadas, etc.

Portanto, eu sugiro recompilar o binário contra uma nova versão do libary, uma incompatibilidade será sinalizada em tempo de compilação.

você pode ver as dependências da biblioteca usando o ldd.

Exemplo;

$ 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)

Edit: ps ... você não pode simplesmente copiar em bibliotecas como elas têm suas próprias dependências. sua máquina de compilação cruzada precisará de versões de lib similares para compilar.

    
por 30.10.2016 / 16:41