Ich habe OpenCV für Arm Following plattformübergreifend kompiliert.dieser Leitfadenund baute diesesBeispielprogramm.
Als ich es zum ersten Mal ausführte, sah es so aus:
./DisplayImage image.png
Ich habe:
./DisplayImage: Fehler beim Laden gemeinsam genutzter Bibliotheken:
libopencv_highgui.so.3.1: Gemeinsam genutzte Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis
Ich dachte also, dass die Bibliothek benötigt wird libopencv_highgui.so.3.1
. Also habe ich alle diese Bibliotheken hinzugefügt zu /lib
:
(1) libopencv_highgui.so
(2) libopencv_highgui.so.3.1
(3) libopencv_highgui.so.3.1.0
symbolische Links: (1) -> (2) -> (3)
Aber jetzt bekomme ich:
./DisplayImage: Fehler beim Laden gemeinsam genutzter Bibliotheken:
lib/libopencv_highgui.so.3.1: interner Fehler
Ich habe file
sowohl die Bibliothek als auch die ausführbare Datei ausgeführt, um ihre Informationen zu überprüfen, und dies ist die Ausgabe:
.../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
bearbeiten:
Beim Laufen readelf -d DisplayImage | grep NEEDED
entstehen:
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]
Ich habe sie alle auf meinem Ziel gefunden, außer ld-linux-armhf.so.3
.
Was könnte die Ursache für dieses „interne Fehlerproblem“ sein?
Antwort1
Beim Kompilieren einer Binärdatei kann diese gemeinsam genutzte Bibliotheken verwenden. Diese Bibliotheken sind Referenzen mit einer Versionsnummer, sodass Sie eine unterstützte Bibliotheksversion erhalten.
Manchmal kommt man damit durch, eine neuere Bibliothek symbolisch mit einem älteren Namen zu verknüpfen. Die Binärdatei versucht dann, diesen zu verwenden.
Dies bedeutet jedoch nicht, dass die Binärdatei diese Version unterstützt. Einige Funktionen können sich geändert haben, einige Funktionen wurden entfernt oder hinzugefügt usw.
Daher würde ich vorschlagen, die Binärdatei mit einer neueren Bibliotheksversion neu zu kompilieren, da Inkompatibilitäten zur Kompilierungszeit gekennzeichnet werden.
Sie können Bibliotheksabhängigkeiten mit ldd sehen.
Beispiel;
$ 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)
Bearbeiten: PS … Sie können nicht einfach zwischen Bibliotheken kopieren, da diese ihre eigenen Abhängigkeiten haben. Ihre Cross-Compile-Maschine benötigt ähnliche Bibliotheksversionen zum Kompilieren.