2011-08-24 11 views
7

Buduję bibliotekę wiersza poleceń biblioteki poleceń dla C++ na Mac OS X (10.7.1). Proces kompilacji jest jako takie:Jak zmodyfikować nazwę instalacji pliku .dylib w czasie kompilacji

$ ./configure --prefix=output 
$ make 
$ make install 

Chciałbym zmienić nazwę install wygenerowanego udostępnionej biblioteki w czasie kompilacji i nie używać install_name_tool później.

Domyślnie install name wygenerowanego udostępnionej biblioteki, libgflags.dylib, to ścieżka wyjściowa:

$ otool -L ./output/libgflags.dylib 
$ ./output/libgflags.dylib: 
    /tmp/gflags-1.5/output/lib/libgflags.0.dylib (compatibility version 2.0.0, current version 2.0.0) 
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

Strona man dla ld(1) ma -install_name opcji, która może być wykorzystana do zmiany instalacji nazwa dynamiczny biblioteka w czasie łącza.

Na przykład, z fikcyjnego programu:

$ g++ -dynamiclib temp.cc -install_name /tmp/temp.dylib -o temp.dylib 
$ otool -L temp.dylib 
temp.dylib: 
    /tmp/temp.dylib (compatibility version 0.0.0, current version 0.0.0) 
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

Ale nie jestem w stanie używać tej opcji wiersza polecenia ze skryptu ./configure. Próbowałem ręcznie ustawiając zmienną CFLAGS, ale to prowadzi do błędu:

$ CFLAGS="-install_name /tmp/desired/location/libgflags.dylib" ./configure 
checking for a BSD-compatible install... /opt/local/bin/ginstall -c 
checking whether build environment is sane... yes 
checking for gawk... no 
checking for mawk... no 
checking for nawk... no 
checking for awk... awk 
checking whether make sets $(MAKE)... yes 
checking for gcc... gcc 
checking whether the C compiler works... no 
configure: error: in `/Users/vibhav/Code/install_name_test/gflags-1.5': 
configure: error: C compiler cannot create executables 

Tak, jest to możliwe dla mnie, aby zmienić nazwę instalacja .dylib generowane przez configure i make bez użycia install_name_tool?

+0

Nie rozumiem, co próbujesz zrobić. Dlaczego po prostu nie możesz uruchomić './configure --prefix/tmp/desired/location'? – adl

+0

To jest poprawne pytanie. Nie mogę ustawić '--prefix' do tej lokalizacji z różnych powodów, w tym, że moja lokalizacja kompilacji różni się od położenia" zainstaluj "mojej aplikacji. Po prostu chcę przekazać odpowiednią flagę linkera podczas używania 'configure'. – v8891

+0

Twój scenariusz nadal nie jest dla mnie jasny. Czy możesz wyjaśnić, w jaki sposób standardowa konfiguracja './configure --prefix/somewhere && make && make install' jest niepoprawna dla twojej instalacji? Dlaczego lokalizacja twojej budowy ma znaczenie? (Powinieneś oczywiście użyć bezwzględnego prefiksu.) Czy próbujesz połączyć się z 'libglflags' bez instalowania? (W takim przypadku powinieneś użyć 'libtool', aby połączyć twoją aplikację z' libflag.la' i pozwolić libtoolowi zrobić magię, aby połączyć się z niezainstalowaną biblioteką.) Czy chcesz zainstalować bibliotekę w tymczasowej lokalizacji zanim zostanie ona zainstalowana? skopiowane do ostatecznej lokalizacji? (To zadanie dla zmiennej DESTDIR). – adl

Odpowiedz

5

Ogólnie, przekazywanie argumentów linkera przez g ++ musi poprzedzać -Wl, a spacje muszą być zastępowane przecinkami. Tak więc, jeśli chcesz przekazać „-install_name /tmp/temp.dylib” do łącznika trzeba będzie nazwać:

g++ -Wl,-install_name,/tmp/temp.dylib ... 
4

jednym z możliwych rozwiązań byłoby ręcznie edytując config.status. ale zanim spróbuję to zrobić, install_name_tool -id uratowało mi życie.

Powiązane problemy