Verwenden Sie gemeinsam genutzte Bibliotheken in / usr / local / lib

58

Ich habe einige Bibliotheken aus Quellen erstellt und die Dateien danach make installsind in/usr/local/lib

In meinem Fall habe ich zum Beispiel die Datei, libodb-2.2.sodie sich in diesem Verzeichnis befindet.

Wenn ich jedoch die ausführbare Datei starte, mit der die Verknüpfung hergestellt wurde libodb, wird der folgende Fehler angezeigt: Fehler beim Laden der gemeinsam genutzten Bibliotheken:libodb-2.2.so: cannont open shared object file: No such file or directory.

Bedeutet das, dass ich meine ausführbare Datei nicht richtig erstellt habe? oder soll ich dem system mitteilen, dass sich im ordner /usr/local/libauch interessante libs befinden können ?

Ich verwende Ubuntu 12.04, Linux-Kernel 3.2.0-38-generic.

Stephane Rolland
quelle
Ich empfehle dringend, dass Sie mit Ihrem Debugger eine gute Freundschaftsbeziehung eingehen
DDS
@DS Ich schlage vor, dass Sie ein bisschen mehr ausarbeiten. Sie wissen, dass es sich hier um eine Website für die Zusammenarbeit handelt. Bitte geben Sie an, auf welche Weise gdbbei einem linkProblem zum Beispiel ohnehin geholfen hätte . Ich bin wirklich neugierig. Zunächst scheint mir Ihre Bemerkung nichts mit dem Problem zu tun zu haben. Aber ich kann mich irren. In der Tat weiß ich nicht genug gdb, und das Laden von Bibliotheken.
Stephane Rolland
Sorry ... Dieser Kommentar sollte auf Stackoverflow auf eine Frage des Lernenden über C - Programmierung platziert wurde ... einfach nicht wurde U & L gesehen
DDS
@DDS Anfänger beim Erlernen von C-Programmierung oder beim Erlernen von Building unter Linux? Bitte seien Sie präziser. Zum Beispiel kam ich von Windows. Das bedeutet nicht, dass ich C ++ nicht kenne ... Ich neige dazu, zu denken, dass Ihr Urteilsverhalten nicht korrekt ist. Selbst wenn es auf SO gewesen wäre, wird Ihr Verhalten bald die Aufmerksamkeit der Moderatoren auf sich ziehen. Sei dir dessen bewusst. Sie befinden sich auf einer COLLABORATIVE-Site, auf der begeisterte Programmierer nützliche Informationen austauschen. Kein Design, das Ihrem Ego schmeichelt. (Keine Sorge, ich wurde auch sanft / vernünftig niedergeschlagen, als ich SO angefangen habe, und ich denke, das war eine wirklich gute Sache, die passiert ist).
Stephane Rolland

Antworten:

58

Für die aktuelle Sitzung können Sie

Exportieren Sie LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

oder die Änderung vorzunehmen permanent können Sie hinzufügen , /usr/local/libum /etc/ld.so.conf(es enthält oder etwas) und führen Sie ldconfigals root.

Wenn Sie immer noch Probleme haben, ldd [executable name]zeigt Ihnen das Ausführen, welche Bibliotheken gesucht werden und welche nicht gefunden werden können.

Flup
quelle
3
Von der manSeite für ldd(1)"Im Normalfall ruft ldd den dynamischen Standardlinker (siehe ld.so(8)) mit der LD_TRACE_LOADED_OBJECTSUmgebungsvariablen auf 1, wodurch der Linker die Bibliotheksabhängigkeiten anzeigt. Beachten Sie jedoch, dass unter bestimmten Umständen einige Versionen von lddmöglicherweise Versuchen Sie, die Abhängigkeitsinformationen durch direktes Ausführen des Programms zu ermitteln. Verwenden Sie daher niemals lddeine nicht vertrauenswürdige ausführbare Datei , da dies zur Ausführung von beliebigem Code führen kann. Eine sicherere Alternative beim Umgang mit nicht vertrauenswürdigen ausführbaren Dateien ist: "
SlySven
4
"... $ objdump -p /path/to/program | grep NEEDED"
SlySven
Netter - ich bin noch nie auf objdump gestoßen.
Flup
Gemäß diesem Artikel ist diese Antwort kanonisch falsch und schädlich . Für einen korrekten Ansatz ist die Verwendung von -Lund -rpathwährend des Kompilierens zum Festlegen des Verknüpfungssuchpfads und des Laufzeitsuchpfads für Bibliotheken gemäß dieser Frage und Antwort der richtige Weg .
Cliff Armstrong
37

Wenn Sie ldconfigdie Bibliothek bereits erstellt haben, lesen Sie weiter. Wenn nicht, lesen Sie zuerst ldconfig .

/usr/local/libbefindet sich möglicherweise nicht im von ldconfig verwendeten Bibliothekspfad. Sie können dies einfach tun:

ldconfig /usr/local/lib

Und das Zeug sollte zum Linker-Cache hinzugefügt werden, aber es ist wahrscheinlich besser, den Pfad richtig hinzuzufügen. Stellen Sie sicher, dass Sie ein /etc/ld.so.conf.dVerzeichnis haben. Wenn ja, fügen Sie eine Datei hinzu (nennen Sie sie "usr-local.conf" oder was auch immer) und fügen Sie eine Zeile ein:

/usr/local/lib

Jetzt lauf ldconfig. Wenn Sie nicht über das Verzeichnis ld.so.conf.d verfügen, sollten Sie über eine /etc/ld.so.conf Datei verfügen , und Sie können diese Zeile am Ende hinzufügen.

Goldlöckchen
quelle
3
Ich habe eine custom.conf-Datei zu /etc/ld.so.conf.dsudoed ldconfig hinzugefügt, um dies zu berücksichtigen, und meine ausführbare Datei kann jetzt gestartet werden.
Stephane Rolland