Jak skompilować 32-bitowy plik binarny na 64-bitowej maszynie z systemem Linux za pomocą gcc / cmake


130

Czy jest możliwe aby skompilować projekt w wersji 32-bitowej z cmakei gccna 64-bitowym systemie? Pewnie tak, ale jak to zrobić?

Kiedy wypróbowałem to w "ignorancki" sposób, bez ustawiania żadnych parametrów / flag / itp., Po prostu ustawienie LD_LIBRARY_PATHznajdowania powiązanych bibliotek ~/tools/libwydaje się ignorować to i szukać tylko w podkatalogach o nazwie lib64 .


1
Czy wystarczyłoby przekazać flagę -m32 do gcc? Jak bym to wtedy zrobił w cmake?
Dala

Odpowiedzi:


126
export CFLAGS=-m32

2
Powinno wystarczyć. Możesz także zmodyfikować skrypt cmake, aby utworzyć 32-bitowy cel - po prostu doda -m32go do CFLAGS, prawdopodobnie ustawiając CMAKE_REQUIRED_FLAGS.
kawiarnia

5
Cóż, problem w tym, że to oczywiście niekoniecznie wystarczy. Być może będziesz musiał dostosować linker!
lpapp

6
Co to exportznaczy? Gdzie to należy? Pliki nagłówkowe? The makefile? Nie, zupełnie nie jest to odpowiedź dla mnie jako początkującego.
Tomáš Zato - Przywróć Monikę

1
@ TomášZato: Po znaku zachęty powłoki, przed wywołaniem cmake(jednak w twoim przypadku, jeśli masz plik Makefile, makezamiast tego używałbyś ).
kawiarnia

4
@caf, czy mógłbyś rozwinąć swoją odpowiedź? Twoja odpowiedź jest bardzo zwięzła i nic nie wyjaśnia.
Bulat M.

77
$ gcc test.c -o testc
$ file testc
testc: 64-bitowy plik wykonywalny ELF LSB, x86-64, wersja 1 (SYSV), połączony dynamicznie (używa bibliotek współdzielonych), dla systemu GNU / Linux 2.6.9, nierozbrany
$ 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-bitowy plik wykonywalny ELF LSB, Intel 80386, wersja 1 (SYSV), połączony dynamicznie (używa bibliotek współdzielonych), dla systemu GNU / Linux 2.6.9, nierozbrany
$ 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 -m32flagi, aby skompilować 32-bitowy plik binarny.

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


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

6
Jak mogę zainstalować 32-bitowe wersje bibliotek?
Tomáš Zato - Przywróć Monikę

2
@ TomášZatosudo apt-get install gcc-multilib
Matthew Murdoch

16

W nowszych wersjach CMake jednym ze sposobów na zrobienie tego na każdym celu jest:

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

Nie wiem, jak to zrobić na całym świecie.


+1. Próbuję zbudować 32-bitowy taglib ( developer.kde.org/~wheeler/taglib.html ) na 64-bitowej lamparcie śnieżnej. To działa dla mnie.
edwardw

3
… Aby zrobić to globalnie:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas

8

W przypadku C ++ możesz:

export CXXFLAGS=-m32

Działa to z cmake.


6

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


2
Konfiguracja środowiska chroot tylko do tworzenia aplikacji 32-bitowych jest trochę ekstremalna, prawda? Jest jakiś szczególny powód, dla którego to polecasz?
Fredrik

3
Zapewnia kompletne środowisko, w którym można również uruchamiać kod. Używamy tego do budowania (i uruchamiania) pełnych 32-bitowych plików binarnych na hostach 64-bitowych - czasami otrzymujesz tylko 32-bitowe kompilacje bibliotek innych firm. Do pracy z Debianem używamy go do budowania pakietów 32-bitowych na hostach 64-bitowych.
Dirk Eddelbuettel

Nigdy nie miałem żadnych problemów z budowaniem i uruchamianiem pełnych 32-bitowych plików binarnych na Linuksie, Solarisie ani na żadnej innej 64-bitowej platformie. Ale nie używam dużo Debiana.
Fredrik

Frederik, czy wdrażasz je również w wersji 32-bitowej na hoście kompilacji 64-bitowej?
Dirk Eddelbuettel

@Dirk: 32-bitowe pliki binarne działają zarówno na komputerach 32-bitowych, jak i 64-bitowych (oczywiście), 64-bitowe pliki binarne działają tylko na komputerach 64-bitowych. Nie ma znaczenia, czy jest to maszyna klienta, czy host kompilacji. Szczerze mówiąc, nie widzę problemu, chyba że budujesz moduły jądra.
Fredrik

6

W przypadku każdej złożonej aplikacji sugeruję użycie kontenera LXC . Kontenery lxc są „czymś pośrodku między chrootem na sterydach a pełnoprawną maszyną wirtualną”.

Na przykład, oto sposób na zbudowanie 32-bitowego wina przy użyciu lxc w 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 tym, jak zbudować 32-bitowy wine na 64-bitowym hoście przy użyciu lxc .


ciekawy. Czy mogę go użyć do skompilowania atomedytora tekstu dla 32-bitowej maszyny 64-bitowej?
Anwar

1
@Anwar, chyba tak. Powinno działać, aby wszystko zbudować.
Sam Watkins,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.