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

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

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

Ответ 1

export CFLAGS=-m32

Ответ 2

$ gcc test.c -o testc
$ file testc
testc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
$ 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: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
$ 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)

Ответ 3

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

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

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

Ответ 4

Для любого сложного приложения я предлагаю использовать контейнер 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

Вот страница wiki о как построить 32-битное вино на 64-битном хосте с использованием lxc.

Ответ 5

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

Ответ 6

Для С++ вы можете сделать:

export CXXFLAGS=-m32

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