shared Libraries einbinden
Re: shared Libraries einbinden
bei einer anderen shared Lib kommt das selbe, also ist das ein generelles Problem bei mir
Re: shared Libraries einbinden
Kam einen Schritt weiter - es kompiliert:
jetzige Fehlermeldung beim ausführen der kompilierten Datei
error while loading shared libraries: libfranka.so.0.3: cannot open shared object file: No such file or directory
doch in dem -L Pfad liegt die .so Datei
jetzige Fehlermeldung beim ausführen der kompilierten Datei
error while loading shared libraries: libfranka.so.0.3: cannot open shared object file: No such file or directory
doch in dem -L Pfad liegt die .so Datei
Re: shared Libraries einbinden
Wenn du ein Programm startest, wird in gewissen Verzeichnissen nach den benötigten Shared Objects gesucht. Du kannst zum Beispiel über die Umgebungsvariable "LD_LIBRARY_PATH" weitere Verzeichnisse durchsuchen lassen.
Unter der Annahme, dass die Bibliothek in "/home/system/libfranka/build/" liegt und die von dir kompilierte Anwendung "test" heißt, könnte der Aufruf folgendermaßen aussehen:
Unter der Annahme, dass die Bibliothek in "/home/system/libfranka/build/" liegt und die von dir kompilierte Anwendung "test" heißt, könnte der Aufruf folgendermaßen aussehen:
Code: Alles auswählen
LD_LIBRARY_PATH=/home/system/libfranka/build/:$LD_LIBRARY_PATH ./test
Re: shared Libraries einbinden
Danke für die Hilfe Xin und nufan, weiß ich zu Schätzen - es funktioniert nun!
Ich werde in Zukunft mich mal mehr damit auseinandersetzen.
Ich werde in Zukunft mich mal mehr damit auseinandersetzen.
Re: shared Libraries einbinden
Ok, nur noch eine Frage:
jedesmal die Variable LD_LIBRARY_PATH setzen ist ja auch umständlich - kann man dem umgehen?(evtl. CMake) Bzw. ich versteh nicht ganz warum ich die nochmal angeben muss, nachdem ich beim compilen alles gelinkt habe.
jedesmal die Variable LD_LIBRARY_PATH setzen ist ja auch umständlich - kann man dem umgehen?(evtl. CMake) Bzw. ich versteh nicht ganz warum ich die nochmal angeben muss, nachdem ich beim compilen alles gelinkt habe.
Re: shared Libraries einbinden
Du verwendest ein Shared Object, also eine dynamisch gelinkte Bibliothek. Einer der Vorteile von Shared Objects ist, dass sie von mehreren Programmen verwendet werden können, obwohl der Code nur ein einziges Mal auf deinem System existiert. Auch die Aktualisierung der Bibliothek wird dadurch wesentlich erleichtert. Das setzt aber voraus, dass die Bibliothek unabhängig von den Programmen gespeichert wird. Es gibt mehrere Möglichkeiten, wie du die direkte Verwendung von LD_LIBRARY_PATH umgehen kannst.
Zuerst solltest du überprüfen, ob deine Linux-Distribution ein fertiges Paket für die Bibliothek bereitstellt und über die Paketverwaltung installieren. Falls das möglich ist, ist keine Änderung der Umgebungsvariable beim Aufruf notwendig.
Anstatt die Variable bei jedem Aufruf zu setzen, kannst du sie auch bei der Initialisierung deiner Konsole setzen.
Je nach verwendeter Konsole wird ein anderes Skript zur Initialisierung verwendet. Bei Bash ist das standardmäßig z.B. ".bashrc".
Du hast mit LD_LIBRARY_PATH die Liste an Verzeichnissen, in denen nach Shared Objects gesucht wird, erweitert. Es gibt auch schon ein paar Standard-Verzeichnisse, in denen danach gesucht wird, wie z.B. /usr/lib/. Du könntest die Bibliothek in dieses Verzeichnis installieren und Anwendungen würden sie dort finden. Von dieser Variante ist aber abzuraten, da du hier händisch in Systemverzeichnissen arbeitest.
Als eine Kombination der beiden vorhergehenden Vorschlägen, könntest du alle Bibliotheken, die du händisch kompilierst, in ein gemeinsames Verzeichnis in deinem Home-Verzeichnis installieren. Mit CMake erreichst du das über die CMAKE_INSTALL_PREFIX-Variable. Wenn du nun dieses Verzeichnis zu LD_LIBRARY_PATH hinzufügst, ersparst du dir das manuelle Hinzufügen jeder einzelnen Bibliothek.
Alternativ kannst du die Bibliothek als statische Bibliothek zu deinem Programm hinzufügen. Die Suche nach der Bibliothek zur Laufzeit fällt weg, du verlierst aber die erwähnten Vorteile von dynamischen Bibliotheken.
Zuerst solltest du überprüfen, ob deine Linux-Distribution ein fertiges Paket für die Bibliothek bereitstellt und über die Paketverwaltung installieren. Falls das möglich ist, ist keine Änderung der Umgebungsvariable beim Aufruf notwendig.
Anstatt die Variable bei jedem Aufruf zu setzen, kannst du sie auch bei der Initialisierung deiner Konsole setzen.
Code: Alles auswählen
export LD_LIBRARY_PATH=/home/system/libfranka/build/:$LD_LIBRARY_PATH
Du hast mit LD_LIBRARY_PATH die Liste an Verzeichnissen, in denen nach Shared Objects gesucht wird, erweitert. Es gibt auch schon ein paar Standard-Verzeichnisse, in denen danach gesucht wird, wie z.B. /usr/lib/. Du könntest die Bibliothek in dieses Verzeichnis installieren und Anwendungen würden sie dort finden. Von dieser Variante ist aber abzuraten, da du hier händisch in Systemverzeichnissen arbeitest.
Als eine Kombination der beiden vorhergehenden Vorschlägen, könntest du alle Bibliotheken, die du händisch kompilierst, in ein gemeinsames Verzeichnis in deinem Home-Verzeichnis installieren. Mit CMake erreichst du das über die CMAKE_INSTALL_PREFIX-Variable. Wenn du nun dieses Verzeichnis zu LD_LIBRARY_PATH hinzufügst, ersparst du dir das manuelle Hinzufügen jeder einzelnen Bibliothek.
Alternativ kannst du die Bibliothek als statische Bibliothek zu deinem Programm hinzufügen. Die Suche nach der Bibliothek zur Laufzeit fällt weg, du verlierst aber die erwähnten Vorteile von dynamischen Bibliotheken.
Re: shared Libraries einbinden
Ok vielen Dank, hab es verstanden
Ich vermute auch das die LD_LIBRARY_PATH mehrere "Werte" enthalten kann, wenn mehrere Libs so angegeben werden.
Ich vermute auch das die LD_LIBRARY_PATH mehrere "Werte" enthalten kann, wenn mehrere Libs so angegeben werden.
Re: shared Libraries einbinden
Ja, mehrere Einträge werden mit einem Doppelpunkt von einander abgetrennt.
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: shared Libraries einbinden
Das könnte man so schon wieder fast ins Wiki übernehmen. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.