gcc не будет связываться с -m32

23

Попытка скомпилировать даже самую простую ( int main(){}) программу -m32в 64-битной системе не удалась:

$ 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

Кажется, он все еще ошибочно ищет неправильные каталоги, когда -m32указано.

libgcc-4.8-dev:i386установлен, и я проверил, что 32-битные библиотеки находятся в /usr/lib/gcc/i686-linux-gnu/4.8/.

Я попытался установить и экспорт LD_INCLUDE_PATHи LD_LIBRARY_PATHбезрезультатно.

Владимир Пантелеев
источник

Ответы:

23

Во-первых, вам нужно установить "gcc-multilib" и "g ++ - multilib"

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

Тогда ваша текущая команда будет работать,

$ 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
Эллиот Фриш
источник
2
Примечание: для программ на C ++ g++-multilibтакже потребуется.
Владимир Пантелеев
1
Рассмотрим также: libc6-dev-i386.
Кенорб
0

Для успешной компиляции кода C в 32-битные исполняемые файлы x86 в среде x86_64 необходимо установить следующие дополнительные пакеты:

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

После вызова компиляции вроде

$ gcc -m32 test.c -o test

преуспевает.

maxschlepzig
источник
0

Эта проблема также возникает, когда gccверсия не совпадает с версией gcc-multilib. В этом случае вы должны установить правильную версию мультибиблиотечных пакетов. Например; Я использовал версию gcc, 4.6поэтому мне пришлось установить gcc-4.6-multilibи g++-4.6-multilibпотому что gcc-multilibпакет по умолчанию был для 4.8.

Эй, ты
источник