shared Libraries einbinden

Schnelle objektorientierte, kompilierende Programmiersprache.
MoMo
Beiträge: 26
Registriert: Mo Mai 07, 2018 9:49 am

Re: shared Libraries einbinden

Beitrag von MoMo » Mi Mai 23, 2018 4:12 pm

bei einer anderen shared Lib kommt das selbe, also ist das ein generelles Problem bei mir

MoMo
Beiträge: 26
Registriert: Mo Mai 07, 2018 9:49 am

Re: shared Libraries einbinden

Beitrag von MoMo » Do Mai 24, 2018 9:16 am

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

nufan
Wiki-Moderator
Beiträge: 2446
Registriert: Sa Jul 05, 2008 3:21 pm

Re: shared Libraries einbinden

Beitrag von nufan » Do Mai 24, 2018 9:24 am

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:

Code: Alles auswählen

LD_LIBRARY_PATH=/home/system/libfranka/build/:$LD_LIBRARY_PATH ./test

MoMo
Beiträge: 26
Registriert: Mo Mai 07, 2018 9:49 am

Re: shared Libraries einbinden

Beitrag von MoMo » Do Mai 24, 2018 12:37 pm

Danke für die Hilfe Xin und nufan, weiß ich zu Schätzen - es funktioniert nun! :D
Ich werde in Zukunft mich mal mehr damit auseinandersetzen.

MoMo
Beiträge: 26
Registriert: Mo Mai 07, 2018 9:49 am

Re: shared Libraries einbinden

Beitrag von MoMo » Fr Mai 25, 2018 7:53 am

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.

nufan
Wiki-Moderator
Beiträge: 2446
Registriert: Sa Jul 05, 2008 3:21 pm

Re: shared Libraries einbinden

Beitrag von nufan » Fr Mai 25, 2018 8:28 am

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.

Code: Alles auswählen

export LD_LIBRARY_PATH=/home/system/libfranka/build/:$LD_LIBRARY_PATH
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.

MoMo
Beiträge: 26
Registriert: Mo Mai 07, 2018 9:49 am

Re: shared Libraries einbinden

Beitrag von MoMo » Fr Mai 25, 2018 8:42 am

Ok vielen Dank, hab es verstanden :)

Ich vermute auch das die LD_LIBRARY_PATH mehrere "Werte" enthalten kann, wenn mehrere Libs so angegeben werden.

nufan
Wiki-Moderator
Beiträge: 2446
Registriert: Sa Jul 05, 2008 3:21 pm

Re: shared Libraries einbinden

Beitrag von nufan » Fr Mai 25, 2018 8:52 am

Ja, mehrere Einträge werden mit einem Doppelpunkt von einander abgetrennt.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8489
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: shared Libraries einbinden

Beitrag von Xin » Fr Mai 25, 2018 9:11 am

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.

Antworten