Попытка скомпилировать даже самую простую (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
безрезультатно.
Во-первых, необходимо установить "gcc-мультиlib" и "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
Для того, чтобы успешно скомпилировать код C в x86 исполняемые файлы на 32 бита в x86_64 среде необходимо установить следующие дополнительные пакеты:
sudo apt-get install libc6-dev-i386 gcc-multilib
После вызова компиляции как
$ gcc -m32 test.c -o test
успешно выполняется.
Эта проблема также происходит когда gcc
версия не соответствует версии gcc-multilib
. В этом случае необходимо установить правильную версию пакетов мультиlib. Например; я использовал gcc версию 4.6
таким образом, я должен был установить gcc-4.6-multilib
и g++-4.6-multilib
потому что значение по умолчанию gcc-multilib
пакет был для 4.8
.
У меня это работает. Я использую Ubuntu 18.04, x86-64.
Во-первых, gcc
и gcc-Multilib
должны соответствовать версиям друг друга.
Если на вашем компьютере установлено несколько версий gcc, вам необходимо указать одну версию в качестве приоритетной. Например, я выбираю gcc 4.8:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 51
Чем больше последнее указанное число, тем больший приоритет он получает. Вы можете проверить их с помощью этой команды:
update-alternatives --config gcc
Затем вам необходимо установить версию gcc-Multilib
, которая соответствует версии gcc:
sudo apt-get install gcc-4.8-multilib
Готово.