LD_LIBRARY_PATH vs LIBRARY_PATH

159

Ich erstelle ein einfaches C ++ - Programm und möchte eine vom System bereitgestellte gemeinsam genutzte Bibliothek vorübergehend durch eine neuere Version ersetzen, um sie zu entwickeln und zu testen.

Ich habe versucht, die Variable LD_LIBRARY_PATH zu setzen, aber der Linker (ld) ist fehlgeschlagen mit:

/ usr / bin / ld: -lyaml-cpp kann nicht gefunden werden

Ich habe erwartet, dass das funktioniert, weil laut der ld-Manpage:

Der Linker verwendet die folgenden Suchpfade, um die erforderlichen gemeinsam genutzten Bibliotheken zu finden: ... Bei einem nativen Linker wird der Inhalt der Umgebungsvariablen "LD_LIBRARY_PATH" ...

Ich habe dann versucht, LIBRARY_PATH zu setzen, und das hat funktioniert.

Laut GCC-Handbuch:

Der Wert von LIBRARY_PATH ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, ähnlich wie PATH. Bei der Konfiguration als nativer Compiler versucht GCC, die so angegebenen Verzeichnisse bei der Suche nach speziellen Linkerdateien zu verwenden, wenn diese mit GCC_EXEC_PREFIX nicht gefunden werden können. Bei der Verknüpfung mit GCC werden diese Verzeichnisse auch verwendet, wenn nach normalen Bibliotheken für die Option -l gesucht wird (mit -L angegebene Verzeichnisse stehen jedoch an erster Stelle).

Wie im Handbuch (GCC) vorgeschlagen, funktioniert LIBRARY_PATH, weil ich mit GCC verknüpfe.

Aber..

  • Da ich mit gcc verlinke, warum wird ld aufgerufen, wie die Fehlermeldung andeutet?
  • Was bringt es, wenn zwei Variablen denselben Zweck erfüllen? Gibt es noch andere Unterschiede?
Georgios Politis
quelle

Antworten:

213

LIBRARY_PATH wird von gcc vor dem Kompilieren verwendet, um Verzeichnisse zu durchsuchen, die statische und gemeinsam genutzte Bibliotheken enthalten, die mit Ihrem Programm verknüpft werden müssen.

LD_LIBRARY_PATHwird von Ihrem Programm verwendet, um Verzeichnisse zu durchsuchen, die gemeinsam genutzte Bibliotheken enthalten, nachdem diese erfolgreich kompiliert und verknüpft wurden.

BEARBEITEN: Wie unten gezeigt, können Ihre Bibliotheken statisch oder gemeinsam genutzt werden. Wenn es statisch ist, wird der Code in Ihr Programm kopiert und Sie müssen nicht nach der Bibliothek suchen, nachdem Ihr Programm kompiliert und verknüpft wurde. Wenn Ihre Bibliothek freigegeben ist, muss sie dynamisch mit Ihrem Programm verknüpft werden, und dann LD_LIBRARY_PATHkommt sie ins Spiel.

Naveen
quelle
14
Und natürlich macht LD_LIBRARY_PATH nur bei dynamischen Bibliotheken Sinn
Alex Jasmin
2
Mein Punkt ist, dass, wenn ich ld zum Verknüpfen (direkt) verwenden würde, LD_LIBRARY_PATH gemäß dem ld-Handbuch verwendet worden wäre, um nach Verzeichnissen zu suchen, die die Bibliotheken enthalten, die mit meinem Programm verknüpft werden müssen. Ich muss hier etwas vermissen ..
Georgios Politis
2
Wenn Sie ld nicht selbst aufrufen und die Objektdateien mit den Bibliotheken kombinieren, wird der Pfad, den gcc an ihn übergibt, "geerbt". Sie können die Standard-gcc mit -Xlinker-Optionen überschreiben.
Naveen
5
Wird tatsächlich LIBRARY_PATH zum Durchsuchen von Verzeichnissen verwendet, die statische UND dynamische Bibliotheken enthalten, anstatt nur statische Bibliotheken.
Partikel128
3
Ja , das ist falsch - der Unterschied ist , dass LIBRARY_PATHdurchsucht für Bibliotheken (statisch oder dynamisch) bei der Kompilierung und LD_LIBRARY_PATHwird für dynamische Bibliotheken zur Laufzeit gesucht. Natürlich müssen Sie zur Laufzeit nicht nach statischen Bibliotheken suchen.
Timmmm
47

LD_LIBRARY_PATHwird gesucht, wenn das Programm startet, LIBRARY_PATHwird zur Verbindungszeit gesucht.

Vorbehalt von Kommentaren :

F'x
quelle
38
Hinweis: Wenn Sie Bibliotheken verknüpfen, ldsuchen Sie selbst nicht nach Bibliotheken in entweder LIBRARY_PATHoder LD_LIBRARY_PATH. Es ist nur , wenn gccaufruft , lddie LIBRARY_PATHverwendet wird. (Das habe ich auf die harte
Tour
1
@ Rufflewind Interessant, wäre aber noch mehr gewesen, wenn Sie einen Hinweis gegeben hätten.
Hmijail trauert um die Rücktritte
Diese Ansicht unterscheidet in dem Moment, in dem nach den Bibliotheken gesucht wird (Verknüpfungszeit gegenüber Laufzeit), während @Naveen den Typ der gesuchten Bibliotheken unterscheidet (statisch v dynamisch). Gibt es zwei Ansichten, die effektiv identisch sind (dynamisch: Laufzeit = statisch: Verbindungszeit), oder gibt es wichtige Situationen, in denen diese Korrespondenz nicht gültig ist? Ich würde vermuten, dass einige Kenntnisse über die dynamischen Bibliotheken auch zur Kompilierungszeit benötigt werden.
XavierStuvw
13

Da ich mit gcc verlinke, warum wird ld aufgerufen, wie die Fehlermeldung andeutet?

gcc ruft ld intern auf, wenn es sich im Verknüpfungsmodus befindet.

heroxbd
quelle