2009-04-24 23 views
15

Come imposto la variabile env LD_LIBRARY_PATH da un Makefile?imposta LD_LIBRARY_PATH da Makefile

Ho un codice sorgente che si collega a una libreria condivisa che a sua volta collega a una libreria condivisa diversa (più di 1). Il Makefile per la creazione dell'applicazione conosce solo la prima libreria condivisa.

Se voglio creare questo, devo specificare: #export LD_LIBRARY_PATH=/path/to/the/shared/libs (per bash) e che funziona bene.

Tuttavia, mi piacerebbe farlo dal Makefile stesso.

risposta

2

avevo provato ad aggiungere:

export LD_LIBRARY_PATH=/path/to/the/shared/libs 

che funziona apparentemente bene.

Stavo ricevendo errori perché il mio/percorso/to/il/shared/libs non era corretto.

Sarebbe ancora bello sapere cosa fanno gli altri per questo e/se c'è un modo migliore.

+1

Sei sicuro che questo funziona? La mia comprensione è che se lo fai dal makefile, 'LD_LIBRARY_PATH' verrebbe definito per questo processo e per i processi figli, ma non nella shell da cui hai eseguito' make'. – Gauthier

9

Sì, "export" è la direttiva corretta da utilizzare. È documentato in dettaglio here. Questo è lo stesso meccanismo usato da se stesso per propagare le variabili alle sub-marche. Lo svantaggio è che non è possibile passare selettivamente la variabile ad alcuni comandi e non ad altri.

Ci sono altre due opzioni che posso pensare:

  • Uso .EXPORT_ALL_VARIABLES (indicare come obiettivo da qualche parte), fa sì che tutte le variabili da esportare verso l'ambiente dei comandi secondari.
  • specificare sulla riga di comando:

    foo: 
        EXPORTEDVAR=somevalue gcc $< -o [email protected] 
    
7

Se non si desidera esportare la variabile LD_LIBRARY_PATH all'interno del makefile (ad esempio perché avete Makefiles ricorsive che tutti aggiungere alla variabile), è può tenerlo legato a tutte le chiamate al tuo compilatore e linker.

O lo si aggiunge direttamente a tutte le chiamate gcc e ld all'interno delle regole di destinazione, ad es.

my_target: my_target.o 
    LD_LIBRARY_PATH=/my/library/path gcc -o my_target my_target.o 

o di impostare le variabili di make globali che definiscono i compilatori comprendono il percorso, ad es .:

CC=LD_LIBRARY_PATH=/my/library/path gcc 
CPP=LD_LIBRARY_PATH=/my/library/path gcc 
CXX=LD_LIBRARY_PATH=/my/library/path gcc 

Ho scelto gcc come compilatore, ma naturalmente si può utilizzare qualsiasi compilatore che ti piace.

2

ho avuto lo stesso problema, ho dovuto esportare LD_LIBRARY_PATH come avete fatto:

export LD_LIBRARY_PATH=/path/to/the/shared/libs ; my_command 

Il mio amico mi ha mostrato un'alternativa quando LD_LIBRARY_PATH si applica solo a un comando, notare senza virgola di seguito.

LD_LIBRARY_PATH=/path/to/the/shared/libs my_command 

Questo article spiega di più.