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.