2010-06-25 16 views
25

Podczas próby kompilacji kopii mojego projektu na komputerze lokalnym pojawia się błąd informujący, że pomija niekompatybilne biblioteki. Nie dzieje się tak, kiedy robię zamieszanie z wersją na żywo hostowaną na serwerze w pracy [idealnie się tam pojawia].Pomijanie niezgodnych bibliotek podczas kompilacji

Różne inne strony doprowadziły mnie do przekonania, że ​​może to być problem związany ze środowiskiem, ponieważ rozwijam 64-bitową dystrybucję Ubuntu i zakładam, że wersja serwerowa działa na 32-bitowym. Niemniej jednak, po ustawieniu moje zmienne środowiskowe do:

CFLAGS+=" -m32" 
CXXFLAGS+=" -m32" 

nadal pojawia się ten sam błąd kompilacji z:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http 

Czy HAZ samouczek?

== Edit ==

To było wyjście otrzymywałem kiedy następuje porady Jonathana:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 

Wydaje się, że biblioteka w pytaniu jest 32-bitowy po wszystkim?

+1

Czy ta biblioteka jest zdecydowanie 32-bitowa? Spróbuj 'file/dvlpmnt/libPI-Http.a' – Rup

+0

@Rup: to może powiedzieć" aktualne archiwum ar ", które nie jest strasznie pomocne. Musisz dostać się do pliku wewnątrz archiwum, jak pokazano w mojej odpowiedzi. –

+0

Proszę napisać linku poleceń linera ... masz rację, wydaje się, że biblioteka jest 32-bitowa, ale może linker szuka 64-bitowych bibliotek pomimo tego, co myślałeś, że zrobiłeś. –

Odpowiedz

28

Ten komunikat nie jest w rzeczywistości błędem - jest tylko ostrzeżeniem, że dany plik nie ma odpowiedniej architektury (na przykład 32-bitowy w porównaniu z 64-bitowym, zła architektura procesora). Łącznik będzie szukał biblioteki odpowiedniego typu.

Oczywiście, jeśli jesteś również uzyskiwanie błąd wzdłuż linii can't find lPI-Http wtedy masz problem :-)

Trudno sugerować co dokładny środek będzie bez znajomości szczegółów systemie build i makefile, ale tutaj jest kilka zdjęć w ciemności:

  1. Wystarczy sprawdzić: zwykle byś dodać flagi CFLAGS zamiast CTAGS - czy jesteś pewien, że to prawidłowe? (To, co masz, może być poprawne - zależy to od twojego systemu budowy!)
  2. Często flaga musi być przekazany do łącznika też - więc może trzeba zmodyfikować LDFLAGS

Jeśli to nie pomoże - możesz opublikować pełne dane wyjściowe błąd, dodatni rzeczywisty polecenia (np. gcc foo.c -m32 -Dxxx itp.), który był wykonywany?

+1

Przykro mi, masz rację. Użyłem CFLAGS zamiast CTAGS: P –

+0

Oprócz tego rozwiązania, możesz dodać '-Wl, - no-warn-search-mismatch' do swojego' CFLAGS', a więc te ostrzeżenia zostaną stłumione. –

9

Zazwyczaj nie jest to błąd jako taki; jest ostrzeżeniem, że pierwszy znaleziony plik odpowiadający argumentowi kompilatorowi/linkerowi jest niepoprawny. Błąd występuje, gdy nie można znaleźć żadnej innej biblioteki z odpowiednią treścią.

Musisz więc sprawdzić, czy /dvlpmnt/libPI-Http.a jest biblioteką 32-bitowych plików obiektowych lub 64-bitowych plików obiektowych - prawdopodobnie będzie to wersja 64-bitowa, jeśli kompilujesz z opcją -m32. Następnie należy ustalić, czy istnieje alternatywny plik libPI-Http.a lub libPI-Http.so w innym miejscu niż 32-bitowy. Jeśli tak, upewnij się, że katalog, który go zawiera, jest wymieniony w argumencie -L/some/where dla łącznika. Jeśli nie, będziesz musiał uzyskać lub zbudować 32-bitową wersję biblioteki skądś.

Aby ustalić, co jest w tej bibliotece, może trzeba zrobić:

mkdir junk 
cd junk 
ar x /dvlpmnt/libPI-Http.a 
file *.o 
cd .. 
rm -fr junk 

Etap „file” powie, jaki rodzaj plików obiektowych są w archiwum. Reszta po prostu upewnia się, że nie zrobisz bałaganu, którego nie da się łatwo oczyścić.

+1

Huh, to dziwne, ten krok pokazuje mi teraz, że wszystkie biblioteki, o których mowa, są w rzeczywistości 32-bitowe. o__o –

+1

@defaultstring: Jaka jest właściwa linia poleceń łączenia? Czy zawiera flagę '-m32'? Dodaj to jako dodatkowe informacje w pytaniu, a nie jako dodatkowy komentarz tutaj, proszę. –

Powiązane problemy