2009-08-09 20 views
14

Próbuję zbudować przełęcz przy użyciu llvm i ukończyłem tworzenie llvm i powiązanych z nim komponentów. Jednak, gdy biegnę zrobić po wykonaniu wszystkich etapów budowy przepustkę tym makefile, pojawia się następującyPrzekazywanie flagi gcc przez makefile

relokacji R_X86_64_32 przeciwko `miejscowym symbolem” nie mogą być stosowane przy dokonywaniu obiekt udostępniony; przekompilować z flagą -fPIC

Po tyring znaleźć poprawkę googlowania komunikat o błędzie, poznałem, że to nie jest specyficzne dla LLVM. Kilka rozwiązań sugerowało, że powinienem używać "--enable-shared" podczas uruchamiania configure, ale to nie pomogło w moim przypadku. Teraz chcę ponownie zbudować llvm przy użyciu fPIC, jak informuje błąd. Ale jak to zrobić, używając makefile?

+0

możliwe duplikat [Recompile z opcją -fPIC, ale opcja ta jest już w makefile] (http: // stackoverflow .com/questions/332767/recompile-with-fpic-option-but-the-option-is-already-in-the-makefile) – senderle

Odpowiedz

11

Wygląda można dodać -fPIC (na kod niezależny od pozycji, chcesz coś do udostępnionej biblioteki, które mogą być załadowane na dowolny adres) poprzez ustawienie zmiennych powłoki:

export CFLAGS="$CFLAGS -fPIC" 
export CXXFLAGS="$CXXFLAGS -fPIC" 

Patrząc na Makefile.rules, zostaną one odebrane i wykorzystane. Wydaje się dziwne, że nie było na początku.

EDIT:

Faktycznie, czytając więcej w makefile, znalazłem link do LLVM Makefile Guide. Z pliku Makefile.rules ustawienie SHARED_LIBRARY = 1 lub LOADABLE_MODULE = 1 (co oznacza SHARED_LIBRARY) w Makefile spowoduje wstawienie -fPIC w flagach kompilatora.

5

Jeśli umiarkowanie przekonany, że należy użyć „-fPIC” wszędzie (lub „-m32” lub „-m64”, które muszę częściej), a następnie można użyć „trik”:

CC="gcc -fPIC" ./configure ... 

Zakłada to powłokę Bourne/Korn/POSIX/Bash i ustawia zmienną środowiskową CC na "gcc -fPIC" przed uruchomieniem skryptu configure. To (zazwyczaj) zapewnia, że ​​wszystkie kompilacje są wykonywane z określonymi flagami. Aby ustawić poprawną "kompilację" kompilacji, czasami działa ona lepiej niż różne inne mechanizmy, które można znaleźć - kompilacja jest trudna do opanowania, z wyjątkiem całkowitego ignorowania faktu, że kompilator C został użyty.

1

Innym rozwiązaniem jest przekazanie -fPIC bezpośrednio dokonać w następujący sposób:

make CFLAGS='-fPIC' CXXFLAGS='-fPIC' 
+1

To nie zadziała, ponieważ przesłania CFLAGS Makefile. –

+0

Udało się to dla mnie. Próbowałeś tego? – Datageek

+3

Próbowałem go :) Twój przykład działa dla prostych spraw. Ale jeśli masz zdefiniowane CFLAGS w pliku makefile, to zostanie ono przesłonięte, zakładając, że twój plik makefile zawiera coś w rodzaju '$ (CC) $ (CFLAGS)' –

Powiązane problemy