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 mylib.so
und sehen Sie, was herauskommtldd
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.Antworten:
Versuchen Sie
ldd foo.so
herauszufinden, ob eine vernünftige Ausgabe vorliegt. Wenn Sie "Warnung: Sie haben keine Ausführungsberechtigung" erhalten, liegt dies daran, dass .so-Dateien ausführbar sein sollen ;).Darüber hinaus weiß ich nicht, ob es eine einfache Möglichkeit gibt, eine .so auf Systemkompatibilität zu überprüfen, aber ich bezweifle, dass der Fehler "Nicht gefunden" angezeigt wird - ich denke, er kann ihn wirklich nicht finden (ich denke auch dort) ist ein geeigneterer Fehler "Dateiformat nicht erkannt", und tatsächlich erkennt der Linker ein solches Problem möglicherweise zunächst nicht. Nur um sicherzugehen, dass wir damit auf derselben Seite sind:
Erstellen Sie einen Symlink im selben Verzeichnis.
ln -s foo.so libfoo.so.1
Letzteres ist das, wonach ld suchen wird.Kompilieren Sie nun ein Testprogramm
g++ -L/directory/path test.cpp -lfoo
.Sagt es immer noch "Keine solche Datei oder kein solches Verzeichnis"?
WRT ldd Ausgabe, wenn Sie solche Sachen bekommen:
Es zeigt an, dass die .so mit einer anderen .so verknüpft ist, die nicht im Bibliothekspfad gefunden werden kann und daher wahrscheinlich nicht installiert ist. Wenn Grund zu der Annahme besteht, dass dies eine gemeinsame Bibliothek ist, die verfügbar sein sollte - z. pthreads - Sie können das Raspbian-Repository nach Paketen durchsuchen, die diese Datei enthalten:
Jetzt wissen wir, dass es mehrere Pakete mit einem solchen Dateinamen gibt (libc6-dev und libc6: armhf). Natürlich ist pthreads sowieso schon installiert. Zurück zu Ihrem eigentlichen Problem:
Stark impliziert, dass wir kein Glück haben WRT ein Raspbian-Paket.
Die Online-Suche nach "libsgfpamx.so" und "sgfpamx" gibt ... nichts zurück. Mit ziemlicher Sicherheit handelt es sich um esoterische oder interne Dinge, die zusammen mit gebaut wurden
mylib.so
, und wenn Sie sie bereits irgendwo haben, haben Sie Glück, sonst müssen Sie sich bei den Verantwortlichen für "mylib.so" erkundigen.quelle
Die libsg libs sind Secugen libs. Sie müssen ein SDK erwerben und es für Ihre Plattform neu erstellen.
quelle