Tengo una biblioteca compilada (sin fuente) para un controlador de huellas digitales. Estoy seguro de que es una compilación ARM porque el comando file mylib.so
dice:
Objeto compartido LSF de 32 bits ELF, ARM, versión 1 (SYSV), vinculado dinámicamente, no eliminado
pero si quiero usarlos en un programa C ++ siempre tengo el mismo error:
error al cargar bibliotecas compartidas: mylib.so: no se puede abrir el archivo de objeto compartido: No existe tal archivo o directorio
este error como ves no es muy explícito, por supuesto, he usado el comando de exportación en la variable LD_LIBRARY_PATH con la ruta de mylib.so.
Entonces, ¿cómo saber si una biblioteca ARM (.so) es compatible con el raspberry PI?
- Editar -
ldd libsgfdu03.so:
not a dynamic executable
ldd libsgfdu04.so:
not a dynamic executable
ldd libsgfpamx.so:
not a dynamic executable
En el SDK, con el .so
, tengo un programa C ++ de muestra para administrar el controlador. Con dos comandos para compilar en un archivo MAKE:
g++ -I./ -I../include -c main.cpp
-> incluye un archivo llamado "sgfplib.h"
g++ /usr/lib/arm-linux-gnueabihf/libusb.so -lpthread -lsgfpamx
-lsgfdu03 -lsgfplib -o ../bin/arm12/sgfplibtest_fdu03 main.o -L/home/pi/sdk/lib/arm12
Todas las rutas son buenas y no se informa ningún error en el momento de la compilación, pero luego ldd
en el ejecutable final ldd sgfplibtest_fdu03
dice:
/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6f76000)
libusb-0.1.so.4 => /lib/arm-linux-gnueabihf/libusb-0.1.so.4 (0xb6f5a000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6f3b000)
libsgfpamx.so => not found
libsgfdu04.so => not found
libsgfplib.so => not found
libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0xb6e6e000)
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6dfd000)
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6dd5000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6ca6000)
/lib/ld-linux-armhf.so.3 (0xb6f83000)
- Edite el mismo controlador con debian x86 -
dpkg -S libsgfpamx.so
dpkg-query: no path found matching pattern *libsgfpamx.so*
ldd sgfplibtest_fdu03 :
linux-gate.so.1 => (0xb76eb000)
libusb-0.1.so.4 => /lib/libusb-0.1.so.4 (0xb76d1000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb76b8000)
libsgfpamx.so => /usr/local/lib/libsgfpamx.so (0xb769d000)
libsgfdu03.so => /usr/local/lib/libsgfdu03.so (0xb7632000)
libsgfplib.so => /usr/local/lib/libsgfplib.so (0xb7623000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7536000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7510000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb74f1000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb73aa000)
/lib/ld-linux.so.2 (0xb76ec000)
El mismo exe (pero compilado para x86) no parece requerir nada más. Estoy totalmente perdido ...
ldd
Es una buena forma de saberlo. Tenga en cuenta que no hay una sola arquitectura ARM: el pi es ARM11, también conocido como. ARMv6, y hay un ARMv7 (Cortex) que no es compatible. Sin embargo, no conozco una manera fácil de distinguir los ejecutables.
ldd mylib.so
y mira lo que sale