Ich habe eine ausführbare Datei, mit der eine libtest.so
dynamische Verknüpfung hergestellt werden muss. Deshalb lege ich sie in dasselbe Verzeichnis:
cd path_to_dir
./binary
Habe aber folgendes:
error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
Wie kann es sein, dass es nicht findet, libtest.so
welches sich bereits im selben Verzeichnis wie die ausführbare Datei befindet?
linux
autoloader
Linuxer
quelle
quelle
echo $LD_LIBRARY_PATH
ist auf meinem Rechner leer :(:
) und nicht durch ein Semikolon getrennt.Sie können LD_LIBRARY_PATH so einstellen, dass der dynamische Linker weiß, wo er suchen muss. Es gibt jedoch bessere Optionen. Sie können Ihre gemeinsam genutzte Bibliothek an einem der Standardorte ablegen. Eine Liste dieser Orte finden Sie unter
/etc/ld.so.conf
(Linux) und/usr/bin/crle
(Solaris)Sie können
-R <path>
beim Erstellen Ihrer Binärdatei an den Linker übergeben, der<path>
der Liste der für Ihre gemeinsam genutzte Bibliothek durchsuchten Verzeichnisse hinzugefügt wird . Hier ist ein Beispiel. Zeigen Sie zunächst das Problem:libtest.h:
libtest.c:
Hallo c:
Makefile (Tabs müssen verwendet werden):
Lass es uns machen:
Wie man es repariert? Fügen Sie
-R <path>
den Linker-Flags hinzu (hier durch EinstellenLDFLAGS
).Wenn Sie sich die Binärdatei ansehen, sehen Sie, dass sie Folgendes benötigt
libtest.so.0
:Die Binärdatei sucht, abgesehen von den Standardverzeichnissen, im angegebenen Verzeichnis nach ihren Bibliotheken:
Wenn die Binärdatei im aktuellen Verzeichnis angezeigt werden soll, können Sie den RPATH auf festlegen
$ORIGIN
. Dies ist etwas knifflig, da Sie sicherstellen müssen, dass das Dollarzeichen nicht von make interpretiert wird. Hier ist eine Möglichkeit, dies zu tun:quelle
make
, z. B. beim manuellen Aufrufeng++
, versuchen Sie-Wl,-rpath='$ORIGIN'
(beachten Sie die einfachen Anführungszeichen), zu verhindern, dass$ORIGIN
eine leere Zeichenfolge angezeigt wird.Um die freigegebenen Objekte aus demselben Verzeichnis wie Ihre ausführbare Datei zu laden, führen Sie einfach Folgendes aus:
Anmerkung: Die Variable LD_LIBRARY_PATH Ihres Systems wird nicht geändert. Die Änderung betrifft nur diese und nur diese Ausführung Ihres Programms.
quelle
Für alle, die noch keine Antwort haben, habe ich selbst einen mit folgendem Vorschlag gefunden:
Sie können versuchen, den ld.so.cache zu aktualisieren, indem Sie Folgendes verwenden:
sudo ldconfig -v
Hat für mich gearbeitet.
quelle
Für alle Benutzer , die CMake für ihren Build verwenden, können Sie
CMAKE_EXE_LINKER_FLAGS
Folgendes festlegen :Dadurch werden die Linker-Flags für alle Build-Typen (z. B. Debug, Release usw.) ordnungsgemäß weitergegeben, sodass zuerst im aktuellen Arbeitsverzeichnis nach .so-Dateien gesucht wird.
quelle
Der dynamische Linker entscheidet, wo nach Bibliotheken gesucht wird. Im Falle von Linux ist der dynamische Linker normalerweise
GNU ld.so
(oder eine Alternative, die sich aus Kompatibilitätsgründen normalerweise identisch verhält).Zitate aus der Wikipedia:
Quelle: https://en.wikipedia.org/wiki/Rpath
quelle