Как скомпилировать 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
7

Для C ++ вы можете:

export CXXFLAGS=-m32

Это работает с cmake.

euccas
источник
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
@ Анвар, я так думаю. Он должен работать, чтобы построить что угодно.
Сэм Уоткинс,