5

Ich habe zwei auf die gleiche Ausgabe Probleme im Zusammenhang mit:Einstellung LD_LIBRARY_PATH Umgebungsvariable eine gemeinsame Bibliothek zur Laufzeit für das Laden (g ++)

  1. Ich habe ein gemeinsames Objekt gespeichert in `pwd`/lib und während Die ausführbare Datei, die sie verwendet, wird erfolgreich kompiliert (durch die Verwendung von -l und -L-Schaltern), zur Laufzeit gibt es mir Kummer. Wenn ich versuche, LD_LIBRARY_PATH=/my/absolute/path/to/library/directory ./test zu laufen, funktioniert es gut. Aber wenn ich LD_LIBRARY_PATH =/my/absolute/path/in/library/verzeichne und ./test mache, heißt es, dass die Shared Library nicht gefunden werden kann. Aber wenn ich wieder LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./test mache, funktioniert es gut !! Irgendwelche Ideen, was ich falsch mache?

  2. Das zweite Problem bezieht sich auf den Export der LD_LIBRARY_PATH-Umgebungsvariable. Wenn ich ein Terminal öffnen und export LD_LIBRARY_PATH=/path/to/stuff eingeben und dann echo $LD_LIBRARY_PATH eingeben, ist die Variable korrekt. Wenn ich jedoch ein Skript schreibe, das den export-Befehl enthält, wird die Variable nicht einfach aktualisiert, sondern ich muss source install.sh ausführen, um die Variable tatsächlich beizubehalten. Was ist die beste Lösung dafür?

Vielen Dank für Ihre Zeit!

Antwort

5

Um die erste zweiten Frage zu beantworten:

source führt das Skript innerhalb des aktuell Shell, ./install.sh öffnet und führt sie in einer anderen Shell. http://www.unix.com/unix-dummies-questions-answers/537-difference-between-source-exec-script.html

Nun zu Ihrer ersten Frage:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./test setzt die Variable LD_LIBRARY_PATH vor nur einen Befehl (der ./test Befehl). Aus dem gleichen Grund oben, glaube ich, wird dies nicht auf die Shell übertragen, die ./test erstellt. Um es persistent zu machen, müssen Sie möglicherweise die export LD_LIBRARY_PATH=... in Ihrem ~/.bashrc

+0

Danke für die Antwort! Ich versuche, einen Weg zu finden, den Pfad zu den geteilten Objekten zu gründen, ohne sudo Befehle zu benutzen (und ihn in/usr/local/lib zu setzen) oder die bash Akte des Benutzers zu ändern. Gibt es einen allgemein akzeptierten Weg? – rhobincu

+0

Hmm, ich denke, es gibt keine "sichere" Möglichkeit, es zu tun, aber schau hier: (http://www.linuxquestions.org/questions/linux-software-2/how-to-set-ld_library_path-684799/). Ich weiß nicht zu viel darüber, aber ich habe Empfehlungen gesehen, um Ihr Hauptprogramm in ein einfaches Skript zu verpacken, das den Bibliothekspfad einrichtet, Ihr aktuelles Programm ausführt und es dann löscht. Anstatt Ihr Programm direkt aufzurufen, sollten Benutzer das Skript ausführen. – maditya

+0

Eigentlich kann dies helfen: http://osr507doc.sco.com/en/tools/ccs_linkedit_dynamic_dirsearch.html Es handelt sich um die LD_RUN_PATH-Variable, die es Ihnen ermöglicht, Ihre Bibliotheksstandorte zur Verknüpfungszeit anzugeben (eine Alternative zu LD_LIBRARY_PATH, die "lässt Sie zur Laufzeit dasselbe machen"). Dies ist ungefähr die Grenze meines Wissens dazu, sorry ... – maditya

1

Ich habe festgestellt, manchmal Hinzufügen -L explizit über die CFLAGS-Umgebungsvariable ist erfolgreich, wenn LD_RUN_PATH nicht war. Wie in: Export CFLAGS = -L/opt/tool/lib