Ich habe eine kompilierte Bibliothek (ohne Quelle) für einen Fingerabdrucktreiber. Ich bin sicher, dass es sich um eine ARM-Kompilierung handelt, da der Befehl file mylib.so
lautet:
Gemeinsames ELF 32-Bit-LSB-Objekt, ARM, Version 1 (SYSV), dynamisch verknüpft, nicht entfernt
aber wenn ich sie in einem C ++ - Programm verwenden möchte, habe ich immer den gleichen Fehler:
Fehler beim Laden von gemeinsam genutzten Bibliotheken: mylib.so: freigegebene Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis
Wie Sie sehen, ist dieser Fehler nicht sehr explizit. Natürlich habe ich den Exportbefehl für die Variable LD_LIBRARY_PATH mit dem Pfad von mylib.so verwendet.
Woher wissen Sie, ob eine ARM-Bibliothek (.so) mit dem Himbeer-PI kompatibel ist?
- Bearbeiten -
ldd libsgfdu03.so:
not a dynamic executable
ldd libsgfdu04.so:
not a dynamic executable
ldd libsgfpamx.so:
not a dynamic executable
Im SDK habe .so
ich mit dem ein C ++ - Beispielprogramm zur Verwaltung des Treibers. Mit zwei Befehlen zum Kompilieren in einem Makefile:
g++ -I./ -I../include -c main.cpp
-> füge eine Datei mit dem Namen "sgfplib.h" hinzu
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
Alle Pfade sind gut und es wird kein Fehler beim Kompilieren gemeldet, aber nach ldd
der endgültigen ausführbaren Datei ldd sgfplibtest_fdu03
heißt es:
/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)
- Bearbeiten Sie den gleichen Treiber mit 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)
Dieselbe Exe (aber für x86 kompiliert) scheint nichts mehr zu erfordern. Ich bin total verloren ....
ldd
ist eine gute Möglichkeit zu sagen. Beachten Sie, dass es nicht nur eine ARM-Architektur gibt - der pi ist ARM11, auch bekannt als. ARMv6, und es gibt ein ARMv7 (Cortex), das nicht kompatibel ist. Ich kenne jedoch keine einfache Möglichkeit, die ausführbaren Dateien voneinander zu unterscheiden.
ldd mylib.so
und sehen Sie, was herauskommt