Как скомпилировать 32-битный двоичный файл на 64-битной машине Linux с помощью gcc / cmake


129

Можно ли скомпилировать проект в 32-битном с cmakeи gccна 64-битной системе? Вероятно, да, но как мне это сделать?

Когда я попробовал это «невежественным» способом, без установки каких-либо параметров / флагов / и т.д., просто настройка LD_LIBRARY_PATHпоиска связанных библиотек в ~/tools/libнем, кажется, игнорировала это и смотрела только в подкаталогах с именем lib64 .


1
Достаточно ли передать gcc флаг -m32? Как мне тогда сделать это в cmake?
dala

Ответы:


124
export CFLAGS=-m32

2
Это должно сработать. Вы также можете изменить сценарий cmake для создания 32-битной цели - он просто добавит -m32в файл CFLAGS, возможно, установив CMAKE_REQUIRED_FLAGS.
caf

5
Проблема в том, что этого, конечно же, недостаточно. Возможно, вам также потребуется настроить компоновщик!
lpapp

6
Что exportзначит? Где это место? Файлы заголовков? makefile? Нет, совершенно не ответ для меня как новичка.
Томаш Зато - Восстановите Монику

1
@ TomášZato: в приглашении оболочки перед вызовом cmake(однако в вашем случае, если у вас есть Makefile, вы будете использовать makeвместо него).
caf,

4
@caf, не могли бы вы уточнить свой ответ? Ваш ответ очень краток и ничего не объясняет.
Булат М.

76
$ gcc test.c -o testc
$ file testc
testc: 64-разрядный исполняемый файл LSB ELF, x86-64, версия 1 (SYSV), динамически скомпонованный (использует общие библиотеки), для GNU / Linux 2.6.9, без удаления
$ ldd testc 
    linux-vdso.so.1 => (0x00007fff227ff000)
    libc.so.6 => /lib64/libc.so.6 (0x000000391f000000)
    /lib64/ld-linux-x86-64.so.2 (0x000000391ec00000)
$ gcc -m32 test.c -o testc
$ file testc
testc: 32-разрядный исполняемый файл LSB ELF, Intel 80386, версия 1 (SYSV), динамически скомпонованный (использует общие библиотеки), для GNU / Linux 2.6.9, без удаления
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2 (0x0075b000)

Вкратце: используйте -m32флаг для компиляции 32-битного двоичного файла.

Также убедитесь, что у вас установлены 32-разрядные версии всех необходимых библиотек (в моем случае все, что мне было нужно в Fedora, было glibc-devel.i386)


1
Большое спасибо! Да, у меня есть 32-битные версии зависимостей.
dala

6
Как установить 32-битные версии библиотек?
Томаш Зато - Восстановите Монику

2
@ TomášZatosudo apt-get install gcc-multilib
Мэтью Мердок

16

В более поздних версиях CMake это можно сделать для каждой цели:

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

Я не знаю, как сделать это глобально.


+1. Я пытаюсь создать 32-разрядную библиотеку тегов ( developer.kde.org/~wheeler/taglib.html ) на 64-разрядном снежном барсе. У меня это работает.
edwardw

3
… Сделать это глобально:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas 07


6

Один из способов - настроить среду chroot. В Debian есть несколько инструментов для этого, например debootstrap.


2
Кажется немного экстремальным настраивать среду chroot только для создания 32-битных приложений, не так ли? Какая-то конкретная причина, почему вы это рекомендуете?
Фредрик,

3
Это дает вам полную среду, в которой также можно запускать код. Мы используем это для создания (и запуска) полных 32-битных двоичных файлов на 64-битных хостах - иногда вы получаете только 32-битные сборки сторонних библиотек. Для работы Debian мы используем его для сборки 32-битных пакетов на 64-битных хостах.
Дирк Эддельбюттель,

Я никогда не испытывал никаких проблем при создании и запуске полных 32-битных двоичных файлов ни на Linux, ни на Solaris, ни на какой-либо другой 64-битной платформе. Но я мало использую Debian.
Фредрик

Фредерик, разворачиваете ли вы их в 32-битном режиме на 64-битном хосте сборки?
Дирк Эддельбюттель,

@Dirk: 32-битные двоичные файлы работают как на 32-битных, так и на 64-битных машинах (конечно), 64-битные двоичные файлы работают только на 64-битных машинах. Не имеет значения, является ли это клиентским компьютером или хостом сборки. Честно говоря, я не понимаю, в чем может быть проблема, если только вы не создаете модули ядра.
Фредрик

6

Для любого сложного приложения я предлагаю использовать контейнер lxc . Контейнеры lxc - это «что-то среднее между chroot на стероидах и полноценной виртуальной машиной».

Например, вот способ собрать 32-битное вино с использованием lxc в системе Ubuntu Trusty:

sudo apt-get install lxc lxc-templates
sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386 --release trusty
sudo lxc-start -n my32bitbox
# login as yourself
sudo sh -c "sed s/deb/deb-src/ /etc/apt/sources.list >> /etc/apt/sources.list"
sudo apt-get install devscripts
sudo apt-get build-dep wine1.7
apt-get source wine1.7
cd wine1.7-*
debuild -eDEB_BUILD_OPTIONS="parallel=8" -i -us -uc -b
shutdown -h now   # to exit the container

Вот вики-страница о том, как собрать 32-битное вино на 64-битном хосте с помощью lxc .


интересный. Могу ли я использовать его для компиляции atomтекстового редактора для 32-битной на 64-битной машине?
Анвар,

1
@ Анвар, я так думаю. Он должен работать, чтобы построить что угодно.
Сэм Уоткинс,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.