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?
LIBRARY_PATH
zum Durchsuchen von Verzeichnissen verwendet, die statische UND dynamische Bibliotheken enthalten, anstatt nur statische Bibliotheken.LIBRARY_PATH
durchsucht für Bibliotheken (statisch oder dynamisch) bei der Kompilierung undLD_LIBRARY_PATH
wird für dynamische Bibliotheken zur Laufzeit gesucht. Natürlich müssen Sie zur Laufzeit nicht nach statischen Bibliotheken suchen.LD_LIBRARY_PATH
wird gesucht, wenn das Programm startet,LIBRARY_PATH
wird zur Verbindungszeit gesucht.Vorbehalt von Kommentaren :
ld
(anstelle vongcc
oderg++
) werden die UmgebungsvariablenLIBRARY_PATH
oderLD_LIBRARY_PATH
nicht gelesen.gcc
oderg++
wird dieLIBRARY_PATH
Umgebungsvariable gelesen (siehe Dokumentation "gcc
Verwendet diese Verzeichnisse bei der Suche nach normalen Bibliotheken" ).quelle
ld
suchen Sie selbst nicht nach Bibliotheken in entwederLIBRARY_PATH
oderLD_LIBRARY_PATH
. Es ist nur , wenngcc
aufruft ,ld
dieLIBRARY_PATH
verwendet wird. (Das habe ich auf die hartegcc ruft ld intern auf, wenn es sich im Verknüpfungsmodus befindet.
quelle