Po godzinach googlingu postanawiam się poddać i poprosić ekspertów. Próbuję zbudować 32-bitową aplikację (xgap, jeśli ktoś zainteresowany) na moim 64 Ubuntu 11.10. W pliku makefile dodałem CFLAGS = -m32 i LDFLAGS = -L / usr / lib32 . Obiekty są wbudowane w 32-bitową dokładność. Ostatnim krokiem jest połączenie wszystkich obiektów i bibliotek dla X okien z tym plikiem wykonywalnym --- xgap. Jakoś ciągle pojawia się ten błąd:
gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11 -lSM -lICE
/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...
/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...
Zainstalowałem obsługę ia32-libs i mutilib . Myślę, że muszę tylko zmusić linker do wygenerowania wyjścia i386. Próbowałem umieścić dwie flagi ld w moim poleceniu gcc, jak pokazano powyżej: -melf_i386 i -oformat elf32-i386 . Ale zdarza się, że gcc nie szuka już 32-bitowej biblioteki w / usr / lib32 . Zastanawiam się, czy muszę uporządkować te flagi w ustalonej kolejności?
Dzięki za pomysł i pomoc!
EDYCJA: kiedy dodam flagę -m32 do mojej ostatniej komendy gcc (uważam, że etap łączenia), nawet jeśli mam flagę -L / usr / lib32, gcc nie szuka już w / usr / lib32 (naprawdę dziwne ...) i generuje następujący błąd:
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status
Czy ktoś ma pojęcie, dlaczego tak się dzieje? Korzystam z narzędzia automatycznego do konfiguracji i wykonania. Jestem naprawdę dobry w modyfikowaniu tych plików skryptów.
EIDT : Rozwiązałem problem. Myślę, że gcc spodziewał się statycznego archiwum biblioteki. Użyłem getlibs skrypt z http://ubuntuforums.org/showthread.php?t=474790 pobrać wszystkie archiwa .a potrzebne do połączenia. Potem gcc działało. Myślę, że gcc przeszukało katalog / usr / lib32, ale nie znalazło archiwów .a, więc przeszukało standardowy katalog, którym jest / usr / lib , w którym znajduje niezgodne pliki * .so .
Ale pytanie brzmi: pliki * .so w / usr / lib32 / z pakietu ia32-libs tak naprawdę nie mają bibliotek potrzebnych do łączenia? Do czego służą te pliki w / usr / lib32 / ?
Odpowiedzi:
LDFLAGS
powinien również obejmować-m32
. Następujące powinny działać:W rzeczywistości możesz usunąć
-L/usr/lib32
część, ponieważ jest to domyślny katalog dla bibliotek 32-bitowych, a twój system jest tego świadomy.Zasadniczo najprostszym sposobem na zbudowanie aplikacji 32-bitowej na komputerze 64-bitowym jest:
.. lub podaj te zmienne, aby skonfigurować skrypt, jeśli używasz autotools.
AKTUALIZACJA:
Wygląda na to, że tak naprawdę nie znasz różnic w łączeniu z bibliotekami statycznymi i dynamicznymi. Postaram się być jak najmniej:
.a
libname.a
dla wersji dynamicznej ilibname_s.a
statycznej..so
bibliotece wykonawczej, która powinna być obecna w twoim systemie.Uwaga: nie mówimy tutaj o zaawansowanych sztuczkach, takich jak jawne ładowanie DSO za pomocą API dlopen () / dlsym ().
źródło
-l/usr/lib32/libXaw.so
zamiast tego karmić ?Otrzymywałem błędy, takie jak:
Naprawiłem to dla mnie:
jeśli używasz pakietu gcc innego niż domyślny (np.
gcc-7
), musisz zainstalować pakiet dla tej konkretnej wersji:źródło
g++-multilib
jest dla g ++ (C ++), dla gcc (C) potrzebujesz równieżgcc-multilib
.