dove si trova LD_LIBRARY_PATH? come posso impostare la variabile env LD_LIBRARY_PATH?


26

Sto cercando di creare un programma c ++ usando Unix.

Ho ricevuto l'errore

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

Ho sentito che ho solo bisogno di impostare la posizione di libboost * nella mia variabile env LD_LIBRARY_PATH e quindi invocare make come avevo originariamente, digitando

-L /usr/lib64 -l boost_regex-mt

o

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Ma dov'è LD_LIBRARY_PATH? come posso impostare la variabile env LD_LIBRARY_PATH?


Perché hai eliminato la maggior parte della tua domanda mentre forniva un contesto utile per comprendere il problema?
jlliagre,

@jlliagre Sono d'accordo: senza il contesto fornito dalla domanda originale, la risposta più votata non ha senso. L'ho riavviato.
Giovanni 1024

Risposte:


25

come posso impostare la variabile env LD_LIBRARY_PATH?

L'hai già impostato quando hai fatto questo:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Ma questo non risolverà il tuo problema. $LD_LIBRARY_PATHviene consultato al momento dell'esecuzione per fornire un elenco di directory aggiuntive in cui cercare librerie collegabili dinamicamente. Non viene consultato al momento del collegamento (tranne forse per l'individuazione delle librerie richieste dagli stessi strumenti creati!).

Per dire al linker dove trovare le librerie in fase di compilazione, devi usare l' -Lopzione linker. Lo hai già fatto anche tu:

-L /usr/lib64

Se l'errore persiste, è necessario assicurarsi che la libreria sia effettivamente presente. Hai un file libboost_regex-mt.soo libboost_regex-mt.ain quella (o qualsiasi) directory? Si noti che un file come libboost_regex-mt.so.othersuffixnon conta per questo scopo. Se non lo possiedi, probabilmente dovrai installare il pacchetto di sviluppo della tua distribuzione per questa libreria.


Sotto Linux, secondo la pagina man ld (1), $LD_LIBRARY_PATHè anche consultato da ld: «5. Per un linker nativo, cerca il contenuto della variabile d'ambiente" LD_LIBRARY_PATH ". »
vinc17

@csx - qual è la tua distribuzione? Ubuntu, Fedora, CentOS, ecc.? Vedi qui, ad esempio: stackoverflow.com/questions/15874220/…
slm

@ vinc17, Quella citazione dalla ldmanpage riguarda solo le dipendenze ricorsive: librerie dipendenti di una libreria che era già stata selezionata per essere collegate. Non riguarda la ricerca di librerie per l'eseguibile che si sta costruendo. Questo è quello che -Lfa.
Celada,

@csx Non so nulla di Linux scientifico, ma se apt-getti dà un comando non trovato, non è derivato da Debian, quindi hai bisogno di un altro metodo per installare il pacchetto mancante. Questo è sicuramente il tuo problema.
Celada,

In ritardo ma: -Ldir -llibdovrebbe funzionare come argomento ldao gcc/g++/etcquando includere la fase di collegamento, ma menzioni Q originali e ripristinate make: con un makefile normale probabilmente ti serve LDFLAGS="whatever"e con un makefile intelligente potresti aver bisogno di quasi tutto, compresi i mattoni da lanciare all'autore del makefile intelligente.
dave_thompson_085,

11

Un altro modo per aggiungere in modo permanente un nuovo percorso in LD_LIBRARY_PATH:

Modifica il .conffile in /etc/ld.so.conf.d/.

Ho mai installato un'applicazione e le sue librerie non sono state riconosciute da un'altra applicazione. Quindi aggiungo il percorso, cioè /usr/local/hdf5/libal x86_64-linux-gnu.conffile. Basta inserire la riga successiva. Salvare.

Quindi corri sudo ldconfig

Ha funzionato.

PS: sistema operativo Ubuntu 14.04


4

Puoi impostarlo nel tuo ~/.profilee / o file init specifico della tua shell (es. ~/.bashrcPer bash, ~/.zshenvper zsh). Quindi è necessario riavviare la shell (ed eventualmente disconnettersi e riconnettersi, a seconda della scelta).

Puoi controllare le tue impostazioni con:

env | grep '^LD_LIBRARY_PATH'

EDIT: LD_LIBRARY_PATHè per le librerie condivise che contengono codice macchina, i cui nomi file in genere contengono .sonel loro nome, eventualmente seguito da numeri separati da punti per distinguere le diverse versioni. È possibile che LD_LIBRARY_PATH, nonostante , non sia stata trovata una libreria a causa della mancata corrispondenza ABI. Si noti inoltre che i linguaggi (come Perl e Python) e i pacchetti possono avere il proprio sistema di librerie (possibilmente anche con .sofile), non correlato a LD_LIBRARY_PATH.


Il mio programma compilato si lamenta ancora di non trovare una libreria Python anche se vedo il percorso corretto usando env | grep '^ LD_LIBRARY_PATH'. Quale potrebbe essere il problema?
Herman Toothrot

@HermanToothrot Ho aggiornato la mia risposta. Nota che python ha il suo sistema di librerie. Sospetto che non lo usi LD_LIBRARY_PATH(per evitare collisioni con le solite librerie). È necessario porre una domanda specifica per questo, con il messaggio di errore visualizzato.
vinc17

3

Se l'errore del percorso della libreria si trova nel linker, durante la compilazione, è necessario aggiungere il percorso alla libreria nella variabile $ LD_LIBRARY_PATH. Se l'errore della libreria è quando si esegue effettivamente il programma compilato, è necessario aggiungere il percorso della libreria a /etc/ld.so.conf ed eseguire ldconfig per ricostruire la cache del percorso di ricerca della libreria.


ha funzionato alla grande! Il mio file conf punta a questa directory /etc/ld.so.conf.d quindi aggiungi un file con il tuo percorso libs a quella cartella. assicurati anche di eseguire ldconfig come root (o sudo it)
RLaaa

0

Risolto con:

aggiungere in /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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.