2009-08-13 7 views
113

Czy jest możliwe aby skompilować projekt w 32-bit z cmake i gcc na 64-bitowym systemie ? Prawdopodobnie tak jest, ale jak to zrobić?Jak skompilować 32-bitowy binarny na 64-bitowej maszynie linux z gcc/cmake

Kiedy próbowałem go „ignorantem” sposób, bez ustawiania żadnych parametrów/flagi/etc, po prostu ustawienie LD_LIBRARY_PATH znaleźć połączonych bibliotek w ~/tools/lib Wydaje zignorować i tylko patrzeć w podkatalogach o nazwach lib64.

+0

Czy wystarczy przekazać flagę -m32 do gcc? Jak mógłbym to zrobić w cmake? – dala

+0

Możliwy duplikat [Prawidłowy sposób wymuszania kompilacji 32-bitowej przy użyciu CMake] (https://stackoverflow.com/questions/5805874/the-proper-way-of-forcing-a-32-bit-compile-using -cmake) – maxschlepzig

Odpowiedz

111
export CFLAGS=-m32 
+0

Rozumiem. Takie proste rozwiązanie ... – dala

+0

Myślę, że to zadziała w połączeniu z cmake? – dala

+2

To powinno zrobić. Możesz także zmodyfikować skrypt cmake, aby utworzyć 32-bitowy cel - po prostu doda '-m32' do' CFLAGS', prawdopodobnie ustawiając 'CMAKE_REQUIRED_FLAGS'. – caf

4

Jednym ze sposobów jest skonfigurowanie środowiska chroot. Debian posiada szereg narzędzi, które na przykład debootstrap

+2

Czujesz się trochę ekstremalnie, konfigurując środowisko chroot tylko po to, by tworzyć aplikacje 32-bitowe, prawda? Jakiś konkretny powód, dla którego polecasz to? – Fredrik

+0

Jak to dokładnie pomaga? – Hasturkun

+2

Daje to kompletne środowisko do uruchamiania kodu. Używamy go do budowania (i uruchamiania) pełnych 32-bitowych plików binarnych na 64-bitowych hostach - czasami otrzymujesz tylko 32-bitowe wersje bibliotek zewnętrznych. Do pracy z Debianem używamy go do budowania pakietów 32-bitowych na 64-bitowych hostach. –

70
 
$ 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żyć flagi -m32 skompilować 32-bitowe w formacie binarnym.

Ponadto, upewnij się, że masz 32-bitowe wersje wszystkich wymaganych bibliotek zainstalowanych (w moim przypadku wszystko, co potrzebne na Fedorze była glibc-devel.i386)

+1

Wielkie dzięki! Tak, mam 32-bitowe wersje zależności. – dala

+6

Jak mogę zainstalować 32-bitowe wersje bibliotek? –

+1

@ TomášZato 'sudo apt-get install gcc-multilib' –

15

W późniejszych wersjach CMake, jednym ze sposobów zrobić na każdej tarczy jest:

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

nie wiem o sposób, aby to zrobić globalnie.

+0

+1. Próbuję zbudować 32-bitowy taglib (http://developer.kde.org/~wheeler/taglib.html) na 64-bitowym systemie Snow Leopard. To działa dla mnie. – edwardw

+2

... zrobić to globalnie: 'cmake -D CMAKE_CXX_FLAGS = -m32. && make' – dyomas

5

Dla każdej złożonej aplikacji sugeruję użycie lxc container. Kontenery lxc są "czymś pośrodku pomiędzy chrootami na sterydach a pełnowartościową maszyną wirtualną".

Na przykład, oto sposób zbudować 32-bitowe wino używając lxc w systemie Trusty Ubuntu:

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 how to build 32-bit wine on a 64-bit host using lxc.

+0

jest interesujący. Czy mogę go użyć do kompilacji edytora tekstu "atomowego" dla 32-bitowego komputera? – Anwar

+1

@Anwar, tak sądzę. Powinno działać na rzecz budowania czegokolwiek. –

+1

Weryfikuję, to działa – Anwar

4

dla C++, można zrobić:

export CXXFLAGS=-m32 

Działa z cmake.