2009-04-24 14 views
15

Jak ustawić zmienną env LD_LIBRARY_PATH z pliku Makefile?zestaw LD_LIBRARY_PATH z Makefile

Mam trochę kodu źródłowego, który prowadzi do biblioteki współdzielonej, która z kolei łączy się z inną biblioteką współdzieloną (więcej niż 1). Plik Makefile do budowania aplikacji zna tylko pierwszą udostępnioną bibliotekę.

Jeśli chcę to zbudować, muszę określić: #export LD_LIBRARY_PATH=/path/to/the/shared/libs (dla bash) i to działa dobrze.

Jednak chciałbym to zrobić z samego pliku Makefile.

Odpowiedz

2

próbowałem dodając:

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

który podobno działa dobrze.

Otrzymywałem błędy, ponieważ moja/path/to/the/shared/libs była niepoprawna.

Wciąż dobrze byłoby wiedzieć, co robią inni i czy jest lepszy sposób.

+1

Czy na pewno to działa? Rozumiem, że jeśli zrobisz to z pliku makefile, dla tego procesu i procesów potomnych zostanie zdefiniowana 'LD_LIBRARY_PATH', ale nie w powłoce, z której uruchomiłeś' make'. – Gauthier

9

Tak, "eksport" jest prawidłową dyrektywą do użycia. Jest on szczegółowo udokumentowany here. Jest to ten sam mechanizm, który sama używa do propagowania zmiennych do pod-kreacji. Wadą jest to, że nie można selektywnie przekazywać zmiennej do niektórych poleceń, a nie do innych.

Istnieją dwie inne opcje można myślę:

  • Korzystanie .EXPORT_ALL_VARIABLES (określić jako cel gdzieś), powoduje, że wszystkie zmienne mają być eksportowane do środowiska podrzędnych poleceń.
  • Określ w wierszu poleceń:

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

Jeśli nie chcesz wyeksportować zmienną LD_LIBRARY_PATH w makefile (np bo trzeba rekurencyjnych Makefile które dodają do zmiennej), należy można go przywiązać do wszystkich wywołań do kompilatora i linkera.

Dodaje się go bezpośrednio do wszystkich połączeń gcc i ld w ramach zasad docelowych, np.

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

lub ustawić markę globalne zmienne definiujące kompilatory zawierać ścieżkę, np .:

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

Wybrałem gcc jak kompilator, ale oczywiście można użyć dowolnego kompilatora chcesz.

2

miałem ten sam problem, musiałem eksportować LD_LIBRARY_PATH jak ty:

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

Mój przyjaciel pokazał mi alternatywę kiedy LD_LIBRARY_PATH odnosi się tylko do jednego polecenia, nie zauważy poniżej średnik.

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

Ten article wyjaśnia więcej.