wo ist LD_LIBRARY_PATH? Wie setze ich die Variable LD_LIBRARY_PATH env?

26

Ich versuche, ein C ++ - Programm mit Unix zu erstellen.

Ich habe den Fehler bekommen

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

Ich habe gehört, dass ich nur die Position von libboost * in meiner LD_LIBRARY_PATH-Umgebungsvariablen festlegen und make dann wie ursprünglich durch Eingabe aufrufen muss

-L /usr/lib64 -l boost_regex-mt

oder

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Aber wo ist LD_LIBRARY_PATH? Wie setze ich die Variable LD_LIBRARY_PATH env?

csx
quelle
Warum haben Sie den größten Teil Ihrer Frage herausgenommen, während sie einen nützlichen Kontext für das Verständnis Ihres Problems bot?
Juli
@jlliagre Ich stimme zu: Ohne den Kontext, den die ursprüngliche Frage bietet, ergibt die Antwort mit den meisten Stimmen keinen Sinn. Ich rollte es zurück.
John1024

Antworten:

25

Wie setze ich die Variable LD_LIBRARY_PATH env?

Sie haben es bereits festgelegt, als Sie dies getan haben:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Aber das wird Ihr Problem nicht lösen. $LD_LIBRARY_PATHwird zum Zeitpunkt der Ausführung konsultiert, um eine Liste zusätzlicher Verzeichnisse bereitzustellen, in denen nach dynamisch verknüpfbaren Bibliotheken gesucht werden kann. Es wird zum Zeitpunkt der Verknüpfung nicht konsultiert (außer zum Auffinden von Bibliotheken, die von den erstellten Tools selbst benötigt werden!).

Um dem Linker beim Erstellen mitzuteilen, wo sich Bibliotheken befinden, müssen Sie die -LLinker-Option verwenden. Das hast du auch schon gemacht:

-L /usr/lib64

Wenn der Fehler weiterhin auftritt, müssen Sie sicherstellen, dass die Bibliothek tatsächlich vorhanden ist. Haben Sie eine Datei libboost_regex-mt.sooder libboost_regex-mt.ain diesem (oder einem anderen) Verzeichnis? Beachten Sie, dass eine Datei wie libboost_regex-mt.so.othersuffixdiese für diesen Zweck nicht zählt. Wenn Sie das nicht haben, müssen Sie wahrscheinlich das Entwicklungspaket Ihrer Distribution für diese Bibliothek installieren.

Celada
quelle
Unter Linux wird gemäß der Manpage ld (1) $LD_LIBRARY_PATHauch ldFolgendes aufgerufen: «5. Durchsuchen Sie für einen nativen Linker den Inhalt der Umgebungsvariablen" LD_LIBRARY_PATH ". »
vinc17
@csx - was ist deine Distribution? Ubuntu, Fedora, CentOS, etc? Siehe hier, zum Beispiel: stackoverflow.com/questions/15874220/…
slm
@ vinc17, Dieses Zitat aus der ldManpage betrifft nur rekursive Abhängigkeiten: abhängige Bibliotheken einer Bibliothek, die bereits zum Verknüpfen ausgewählt wurde. Es geht nicht darum, Bibliotheken für die zu erstellende ausführbare Datei zu finden. Das ist was -Ltut.
Celada
@csx Ich weiß nichts über wissenschaftliches Linux, aber wenn apt-getSie den Befehl nicht gefunden haben, ist er nicht von Debian abgeleitet, so dass Sie eine andere Methode benötigen, um das fehlende Paket zu installieren. Genau das ist dein Problem.
Celada
Spät aber: -Ldir -llibsollte als Argumente für ldoder für die gcc/g++/etcEinbindung der Link-Phase dienen, aber original & restaurierte Q-Erwähnungen make: Mit einem normalen Makefile benötigen Sie wahrscheinlich LDFLAGS="whatever"und mit einem cleveren Makefile benötigen Sie möglicherweise fast alles, auch Steine, um den cleveren Makefile-Autor anzugreifen.
Dave_Thompson_085
11

Eine andere Möglichkeit, einen neuen Pfad dauerhaft in LD_LIBRARY_PATH hinzuzufügen:

.confDatei bearbeiten in /etc/ld.so.conf.d/.

Ich habe jemals eine Anwendung installiert und ihre Bibliotheken konnten von keiner anderen Anwendung erkannt werden. Dann füge ich den Pfad hinzu, dh /usr/local/hdf5/libzur x86_64-linux-gnu.confDatei. Gib einfach die nächste Zeile ein. Speichern.

Dann renne sudo ldconfig

Es funktionierte.

PS: OS Ubuntu 14.04

iparjono
quelle
4

Sie können es in Ihrer ~/.profileund / oder spezifischen Init-Datei Ihrer Shell einstellen (zB ~/.bashrcfür bash, ~/.zshenvfür zsh). Dann müssen Sie Ihre Shell neu starten (und sich möglicherweise abmelden und wieder anmelden, abhängig von Ihrer Wahl).

Sie können Ihre Einstellungen überprüfen mit:

env | grep '^LD_LIBRARY_PATH'

BEARBEITEN: LD_LIBRARY_PATHist für gemeinsam genutzte Bibliotheken gedacht, die Maschinencode enthalten, dessen Dateinamen normalerweise .soin ihrem Namen enthalten sind, möglicherweise gefolgt von Zahlen, die durch Punkte voneinander getrennt sind, um verschiedene Versionen zu unterscheiden. Es ist jedoch möglich, dass LD_LIBRARY_PATHeine Bibliothek aufgrund einer ABI-Nichtübereinstimmung nicht gefunden wird. Beachten Sie auch, dass Sprachen (wie Perl und Python) und Pakete möglicherweise ein eigenes Bibliothekssystem haben (möglicherweise auch mit .soDateien), das nichts damit zu tun hat LD_LIBRARY_PATH.

vinc17
quelle
Mein kompiliertes Programm beschwert sich immer noch darüber, keine Python-Bibliothek gefunden zu haben, obwohl ich mit env | den korrekten Pfad sehe grep '^ LD_LIBRARY_PATH'. Woran könnte das liegen?
Herman Toothrot
@HermanToothrot Ich habe meine Antwort aktualisiert. Beachten Sie, dass Python ein eigenes Bibliothekssystem hat. Ich vermute, dass es nicht verwendet wird LD_LIBRARY_PATH(um Kollisionen mit den üblichen Bibliotheken zu vermeiden). Dazu müssen Sie eine bestimmte Frage mit der Fehlermeldung stellen, die Sie erhalten.
Vinc17
3

Wenn sich Ihr Bibliothekspfadfehler im Linker befindet, müssen Sie während des Kompilierens den Pfad zur Bibliothek in die Variable $ LD_LIBRARY_PATH einfügen. Wenn der Bibliotheksfehler auftritt, wenn Sie das kompilierte Programm tatsächlich ausführen, müssen Sie den Bibliothekspfad zu /etc/ld.so.conf hinzufügen und ldconfig ausführen, um den Cache des Bibliothekssuchpfads neu zu erstellen.

Gary
quelle
das hat super geklappt! Meine conf-Datei verweist auf dieses Verzeichnis /etc/ld.so.conf.d, fügen Sie also einfach eine Datei mit Ihrem libs-Pfad zu diesem Ordner hinzu. Stellen Sie außerdem sicher, dass Sie ldconfig als root ausführen (oder sudo it)
RLaaa
0

Gelöst mit:

hinzufügen /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
Dave
quelle