gcc nie będzie łączyło się z -m32

23

Próba kompilacji nawet najprostszego ( int main(){}) programu -m32w systemie 64-bitowym kończy się niepowodzeniem:

$ gcc -m32 test.c
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status

Wydaje się, że nadal błędnie przeszukuje niewłaściwe katalogi, gdy -m32jest określony.

libgcc-4.8-dev:i386jest zainstalowany i sprawdziłem, czy biblioteki 32-bitowe znajdują się w /usr/lib/gcc/i686-linux-gnu/4.8/.

Próbowałem ustawić i eksportować LD_INCLUDE_PATHi LD_LIBRARY_PATHbezskutecznie.

Vladimir Panteleev
źródło

Odpowiedzi:

23

Najpierw musisz zainstalować „gcc-multilib” i „g ++ - multilib”

sudo apt-get install gcc-multilib g++-multilib

Wtedy twoje obecne polecenie zadziała,

$ cat hello.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    puts("Hello, World!");
}
$ uname -a
Linux vbox-1404 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc -m32 hello.c
$ ./a.out
Hello, World!
$ file a.out
a.out: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=80bdc95e2941e3ba8d7bb7c1682098f20e77cebc, not stripped
Elliott Frisch
źródło
2
Uwaga: g++-multilibWymagane będą także programy C ++ .
Vladimir Panteleev
1
Zastanów się również: libc6-dev-i386.
kenorb
0

Aby pomyślnie skompilować kod C do 32-bitowych plików wykonywalnych x86 w środowisku x86_64, musisz zainstalować następujące dodatkowe pakiety:

sudo apt-get install libc6-dev-i386 gcc-multilib

Po wywołaniu kompilacji jak

$ gcc -m32 test.c -o test

udaje się.

maxschlepzig
źródło
0

Ten problem występuje również wtedy, gdy gccwersja nie pasuje do wersji gcc-multilib. W takim przypadku powinieneś zainstalować poprawną wersję pakietów multilib. Na przykład; Używałem wersji gcc, 4.6więc musiałem zainstalować gcc-4.6-multilibi g++-4.6-multilibponieważ gcc-multilibbył to domyślny pakiet 4.8.

Cześć
źródło