J'ai une bibliothèque compilée (sans source) pour un pilote d'empreinte digitale. Je suis sûr que c'est une compilation ARM car la commande file mylib.so
dit:
Objet partagé ELF 32 bits LSB, ARM, version 1 (SYSV), lié dynamiquement, non supprimé
mais si je veux les utiliser dans un programme C ++ j'ai toujours la même erreur:
erreur lors du chargement des bibliothèques partagées: mylib.so: impossible d'ouvrir le fichier d'objet partagé: aucun fichier ou répertoire de ce type
cette erreur comme vous le voyez n'est pas très explicite, bien sûr j'ai utilisé la commande d'exportation sur la variable LD_LIBRARY_PATH avec le chemin de mylib.so.
Alors, comment savoir si une bibliothèque ARM (.so) est compatible avec le Raspberry PI?
-- Éditer --
ldd libsgfdu03.so:
not a dynamic executable
ldd libsgfdu04.so:
not a dynamic executable
ldd libsgfpamx.so:
not a dynamic executable
Dans le SDK, avec le .so
, j'ai un exemple de programme C ++ pour gérer le pilote. Avec deux commandes pour compiler dans un makefile:
g++ -I./ -I../include -c main.cpp
-> inclure un fichier nommé "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
Tous les chemins sont bons et aucune erreur n'est signalée au moment de la compilation, mais après ldd
l'exécutable final ldd sgfplibtest_fdu03
dit:
/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)
- Modifier le même pilote avec 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)
Le même exe (mais compilé pour x86) ne semble plus exiger rien de plus. Je suis totalement perdu ...
ldd
est un bon moyen de le savoir. Notez qu'il n'y a pas qu'une seule architecture ARM - le pi est ARM11, alias. ARMv6, et il y a un ARMv7 (Cortex) qui n'est pas compatible. Je ne connais pas de moyen facile de distinguer les exécutables.
ldd mylib.so
et voyez ce qui sort