LD_LIBRARY_PATH vs LIBRARY_PATH


159

Sto creando un semplice programma C ++ e voglio sostituire temporaneamente una libreria condivisa fornita dal sistema con una versione più recente di essa, per lo sviluppo e il testing.

Ho provato a impostare la variabile LD_LIBRARY_PATH ma il linker (ld) non è riuscito con:

/ usr / bin / ld: impossibile trovare -lyaml-cpp

Mi aspettavo che funzionasse perché secondo la pagina man di ld:

Il linker utilizza i seguenti percorsi di ricerca per individuare le librerie condivise richieste: ... Per un linker nativo, il contenuto della variabile di ambiente "LD_LIBRARY_PATH" ...

Ho quindi provato a impostare LIBRARY_PATH e ha funzionato.

Secondo il manuale GCC:

Il valore di LIBRARY_PATH è un elenco di directory separato da due punti, molto simile a PATH. Se configurato come compilatore nativo, GCC prova le directory così specificate durante la ricerca di file linker speciali, se non riesce a trovarli usando GCC_EXEC_PREFIX. Il collegamento tramite GCC utilizza anche queste directory quando si cercano le librerie ordinarie per l'opzione -l (ma le directory specificate con -L vengono prima).

Come suggerisce il manuale (GCC), LIBRARY_PATH funziona perché mi collego a GCC.

Ma..

  • Da quando mi collego a gcc, perché viene chiamato ld, come suggerisce il messaggio di errore?
  • Qual è il punto di avere due variabili che servono allo stesso scopo? Ci sono altre differenze?

Risposte:


213

LIBRARY_PATH viene usato da gcc prima della compilazione per cercare directory contenenti librerie statiche e condivise che devono essere collegate al tuo programma.

LD_LIBRARY_PATHviene utilizzato dal programma per cercare directory contenenti librerie condivise dopo che è stato compilato e collegato correttamente.

MODIFICA: Come indicato di seguito, le tue librerie possono essere statiche o condivise. Se è statico, il codice viene copiato nel programma e non è necessario cercare la libreria dopo aver compilato e collegato il programma. Se la tua libreria è condivisa, allora deve essere collegata dinamicamente al tuo programma ed è allora che LD_LIBRARY_PATHentra in gioco.


14
E ovviamente LD_LIBRARY_PATH ha senso solo con le librerie dinamiche
Alex Jasmin,

2
Il mio punto è che se dovessi usare ld per il collegamento (direttamente), quindi, secondo il manuale ld, LD_LIBRARY_PATH sarebbe stato usato per cercare directory contenenti le librerie che devono essere collegate al mio programma. Mi manca qualcosa qui ..
Georgios Politis,

2
a meno che non invochi te stesso e combini i file oggetto con le librerie, "erediterà" il percorso che gcc gli passa. Puoi sovrascrivere il gcc standard, con le opzioni -Xlinker.
Naveen,

5
In realtà, LIBRARY_PATH viene utilizzato per la ricerca di directory contenenti librerie statiche AND dinamiche, anziché solo librerie statiche.
particle128

3
Sì, questo è sbagliato - la differenza è che LIBRARY_PATHvengono ricercate le librerie (statiche o dinamiche) in fase di compilazione e LD_LIBRARY_PATHvengono ricercate le librerie dinamiche in fase di esecuzione. Ovviamente in fase di esecuzione non è necessario cercare librerie statiche.
Timmmm

47

LD_LIBRARY_PATHviene cercato all'avvio del programma, LIBRARY_PATHviene cercato al momento del collegamento.

avvertimento dai commenti :


38
Nota: quando si collegano le librerie, di ldper sé non cerca le librerie in nessuno dei due LIBRARY_PATHo LD_LIBRARY_PATH. È solo quando gccinvoca ldche LIBRARY_PATHviene utilizzato. (L'
ho

1
@Rufflewind Interessante, ma sarebbe stato ancora di più se avessi dato qualche riferimento.
hmijail piange le dimissioni il

Questa vista fa una distinzione nel momento in cui le librerie vengono cercate (tempo di collegamento rispetto al tempo di esecuzione) mentre @Naveen fa una distinzione del tipo di librerie che sono state cercate (statico v dinamico). Esistono due viste effettivamente identiche (dinamica: tempo di esecuzione = statica: tempo di collegamento) o ci sono situazioni importanti in cui questa corrispondenza non è valida? Immagino che alcune conoscenze sulle librerie dinamiche siano necessarie anche al momento della compilazione.
XavierStuvw,

13

Da quando mi collego a gcc, perché viene chiamato ld, come suggerisce il messaggio di errore?

gcc chiama ld internamente quando è in modalità collegamento.

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.