Eu compilei o OpenCV para seguir o braçoeste guia, e construiu issoprograma de amostra.
Quando executei pela primeira vez assim:
./DisplayImage image.png
Eu obtive:
./DisplayImage: erro ao carregar bibliotecas compartilhadas:
libopencv_highgui.so.3.1: não é possível abrir o arquivo de objeto compartilhado: esse arquivo ou diretório não existe
Então imaginei que precisa da biblioteca libopencv_highgui.so.3.1
. Então adicionei todas essas bibliotecas 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 recebendo:
./DisplayImage: erro ao carregar bibliotecas compartilhadas:
lib/libopencv_highgui.so.3.1: erro interno
Executei file
a biblioteca e o executável para verificar suas informações, e este é o 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
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”?
Responder1
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ê obtenha uma versão de biblioteca que seja suportada.
às vezes você pode conseguir vincular sym uma biblioteca mais recente a um nome mais antigo, o binário tentará usar esta.
entretanto, isso não significa que o binário suportará essa versão. Algumas funções podem ter sido alteradas, algumas funções removidas ou adicionadas, e assim por diante.
Portanto, eu sugiro recompilar o binário com uma versão mais recente da biblioteca; incompatibilidades serão sinalizadas em tempo de compilação.
você pode ver as dependências da biblioteca usando 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)
Editar: ps... você não pode simplesmente copiar bibliotecas, pois elas têm suas próprias dependências. sua máquina de compilação cruzada precisará de versões de lib semelhantes para compilar.