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 / ?