Jak skompilować 32-bitowy plik binarny na 64-bitowym komputerze z systemem linux za pomocą gcc / cmake

Czy możliwe jest skompilowanie projektu w 32-bitowym z cmake i gcc na 64-bitowym systemie? Pewnie tak, ale jak to zrobić?

Kiedy próbowałem tego w "ignorancki" sposób, bez ustawiania żadnych parametrów/flags/etc, po prostu ustawienie LD_LIBRARY_PATH, aby znaleźć połączone biblioteki w ~/tools/lib wydaje się ignorować go i szukać tylko w podkatalogach o nazwie lib64.

Author: Szabolcs Dombi, 2009-08-13

6 answers

export CFLAGS=-m32
 118
Author: caf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-13 14:44:21
$ 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)

W skrócie: użyj -m32 Flaga do skompilowania 32-bitowego pliku binarnego.

Upewnij się również, że masz zainstalowane 32-bitowe wersje wszystkich wymaganych bibliotek (w moim przypadku wszystko, czego potrzebowałem na Fedorze, to glibc-devel.i386)

 71
Author: andri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-13 14:45:02

W późniejszych wersjach CMake, jednym ze sposobów, aby to zrobić na każdym celu jest:

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

Nie wiem, jak to zrobić globalnie.
 15
Author: Nathan Monteleone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-29 22:03:37

W C++ można zrobić:

export CXXFLAGS=-m32
To działa z cmake.
 6
Author: euccas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-04 23:40:11

Jednym ze sposobów jest ustawienie środowiska chroot. Debian ma do tego wiele narzędzi, na przykład debootstrap

 5
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-13 14:45:01

Do każdego złożonego zastosowania proponuję użyć pojemnika lxc . kontenery lxc są "czymś pośrodku między chrootem na sterydach a pełnowartościową maszyną wirtualną".

Na przykład, oto sposób na zbudowanie 32-bitowego wine za pomocą lxc na systemie 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

Oto strona wiki o Jak zbudować 32-bitowe wine na 64-bitowym hoście za pomocą lxc .

 5
Author: Sam Watkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 12:01:27