Domanda
Sto costruendo un semplice programma C ++ e voglio sostituire temporaneamente un sistema fornito libreria condivisa con una versione più recente di esso, per lo sviluppo e la sperimentazione.
Ho provato a impostare la variabile LD_LIBRARY_PATH, ma il linker (ld) venuto a mancare con:
/ usr / bin / ld: non riesce a trovare -lyaml-cpp
Mi aspettavo che per lavoro, perché secondo la pagina ld man:
Il linker utilizza la seguente ricerca percorsi per individuare il termine condiviso biblioteche: ... per un linker nativo, il contenuto della variabile ambiente "LD_LIBRARY_PATH" ...
Allora ho provato a fissare il LIBRARY_PATH, e che ha funzionato.
Secondo il manuale GCC:
Il valore di LIBRARY_PATH è una lista separata da due punti di directory, molto simile a PATH. quando configurato come un compilatore nativo, GCC cerca le directory così designati durante la ricerca di linker speciale file, se non riesce a trovare utilizzando GCC_EXEC_PREFIX. Collegamento con GCC utilizza anche queste directory quando alla ricerca di librerie ordinarie l'opzione -l (ma le directory specificata con -L venire prima).
Come suggerisce il manuale (GCC), LIBRARY_PATH funziona perché collego con GCC.
Ma ..
- Dato che io collego con gcc perché ld è essere chiamato, come il messaggio di errore suggerisce?
- Qual è il punto di avente due variabili che servono la stessa scopo? C'è qualche altro sono differenze?
Soluzione
LIBRARY_PATH
è usato da gcc prima della compilazione di directory contenenti statica ricerca e le librerie condivise che devono essere collegato al vostro programma.
LD_LIBRARY_PATH
viene utilizzato dal programma per le directory che contengono la ricerca condiviso le librerie dopo che è stato compilato e collegato con successo.
EDIT:
Come sottolineato in basso, le librerie possono essere statici o in comune. Se è statico, allora il codice viene copiato nel vostro programma e non è necessario per cercare la libreria dopo che il programma è stato compilato e collegato. Se la libreria è condivisa quindi ha bisogno di essere dinamicamente collegato al tuo programma e che, quando LD_LIBRARY_PATH
entra in gioco.
Altri suggerimenti
LD_LIBRARY_PATH
viene cercato quando il programma si avvia, LIBRARY_PATH
è cercato in fase di collegamento.
- Quando si collega librerie con
ld
(invece digcc
og++
), le variabili d'ambiente oLIBRARY_PATH
LD_LIBRARY_PATH
non vengono letti. - Quando si collega con le librerie
gcc
og++
, la variabile d'ambienteLIBRARY_PATH
viene letto (vedi documentazione "gcc
utilizza questi indici per la ricerca di librerie ordinari" ).
Da quando ho legame con gcc perché ld è chiamata, come suggerisce il messaggio di errore?
gcc chiama ld internamente quando è in modalità di collegamento.