web-dev-qa-db-fra.com

Comment compiler un binaire 32 bits sur une machine Linux 64 bits avec gcc / cmake

Est-il possible de compiler un projet en 2 bits avec cmake et gcc sur un système 64 bits? C'est probablement le cas, mais comment puis-je le faire?

Quand je l'ai essayé de la manière "ignorante", sans définir de paramètres/indicateurs/etc, il suffit de définir LD_LIBRARY_PATH pour trouver les bibliothèques liées dans ~/tools/lib il semble l’ignorer et ne rechercher que dans les sous-répertoires nommés lib64 .

126
dala
export CFLAGS=-m32
121
caf
 $ gcc test.c -o testc 
 $ fichier testc 
 testc: ELF exécutable LSB 64 bits, x86-64, version 1 (SYSV), lié dynamiquement (utilise partagé libs), pour GNU/Linux 2.6.9, non supprimés 
 $ 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 
 $ fichier testc 
 testc: exécutable ELF 32 bits ELF, Intel 80386, version 1 (SYSV), lié de manière dynamique (utilise des bibliothèques partagées), pour GNU/Linux 2.6.9, non supprimé 
 $ ldd testc 
 linux-gate.so.1 => (0x009aa000) 
 libc.so.6 => /lib/libc.so.6 (0x00780000) 
 /lib/ld-linux.so.2 (0x0075b000) 

En bref: utilisez le -m32 drapeau pour compiler un fichier binaire 32 bits.

Assurez-vous également que les versions 32 bits de toutes les bibliothèques requises sont installées (dans mon cas, tout ce dont j'avais besoin sur Fedora était glibc-devel.i386).

75
andri

Dans les versions ultérieures de CMake, une façon de le faire sur chaque cible est:

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

Je ne connais pas de moyen de le faire globalement.

15
Nathan Monteleone

Pour C++, vous pouvez faire:

export CXXFLAGS=-m32

Cela fonctionne avec cmake.

7
euccas

Une solution consiste à configurer un environnement chroot. Debian dispose d’un certain nombre d’outils pour cela, par exemple debootstrap

6
Dirk Eddelbuettel

Pour toute application complexe, je suggère d'utiliser un conteneur lxc . Les conteneurs lxc sont "quelque chose au milieu entre un chroot sur des stéroïdes et une machine virtuelle à part entière".

Par exemple, voici un moyen de créer du vin 32 bits à l'aide de lxc sur un système 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

Voici la page wiki à propos de comment construire du vin 32 bits sur un hôte 64 bits à l'aide de lxc .

6
Sam Watkins