2009-08-13 9 views
113

Est-il possible de compiler un projet dans 32 bits avec cmake et gcc sur un système 64 bits? C'est probablement le cas, mais comment le faire?Comment compiler un fichier binaire 32 bits sur une machine Linux 64 bits avec gcc/cmake

Quand je l'ai essayé la voie « ignorants », sans poser de paramètres/drapeaux/etc, couchait LD_LIBRARY_PATH pour trouver les bibliothèques liées à ~/tools/lib, il semble l'ignorer et seulement regarder dans les sous-répertoires nommés lib64.

+0

Serait-il suffisant de passer le drapeau -m32 à gcc? Comment ferais-je cela dans cmake? – dala

+0

Copie possible de [La bonne façon de forcer une compilation 32 bits en utilisant CMake] (https://stackoverflow.com/questions/5805874/the-proper-way-of-forcing-a-32-bit-compile-using -cmake) – maxschlepzig

Répondre

111
export CFLAGS=-m32 
+0

Je vois. Une solution si simple ... – dala

+0

Je suppose que cela fonctionnera en combinaison avec cmake? – dala

+2

Cela devrait faire. Vous pouvez également modifier le script cmake pour créer une cible 32 bits - il suffirait d'ajouter '-m32' à' CFLAGS', probablement en définissant 'CMAKE_REQUIRED_FLAGS'. – caf

4

Une façon consiste à configurer un environnement chroot. Debian a un certain nombre d'outils pour que, par exemple debootstrap

+2

Se sent un peu extrême pour installer un environnement chroot juste pour construire des applications 32 bits, n'est-ce pas? Une raison particulière pour laquelle vous recommandez cela? – Fredrik

+0

Comment cela aide-t-il, exactement? – Hasturkun

+2

Il vous donne un environnement complet dans lequel exécuter également du code. Nous utilisons cela pour construire (et exécuter) des binaires 32 bits complets sur des hôtes 64 bits - parfois, vous obtenez seulement des versions 32 bits de bibliothèques tierces. Pour le travail Debian, nous l'utilisons pour construire des paquets 32 bits sur des hôtes 64 bits. –

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) 

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

Aussi, assurez-vous que vous avez les versions 32 bits de toutes les bibliothèques requises installées (dans mon cas tout ce que je avais besoin sur Fedora était glibc-devel.i386)

+1

Un grand merci! Oui, j'ai des versions 32 bits des dépendances. – dala

+6

Comment puis-je installer les versions 32 bits des bibliothèques? –

+1

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

15

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 sais pas d'une façon de le faire à l'échelle mondiale.

+0

+1. J'essaye de construire le taglib 32-bit (http://developer.kde.org/~wheeler/taglib.html) sur un léopard des neiges 64-bit. Cela fonctionne pour moi. – edwardw

+2

... pour le faire globalement: 'cmake -D CMAKE_CXX_FLAGS = -m32. && make' – dyomas

5

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

Par exemple, voici un moyen de construire le vin 32 bits en utilisant lxc sur un système 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 

Voici la page wiki à propos how to build 32-bit wine on a 64-bit host using lxc.

+0

intéressant. Puis-je l'utiliser pour compiler l'éditeur de texte 'atom' pour 32 bits dans la machine 64 bits? – Anwar

+1

@Anwar, je suppose. Cela devrait fonctionner pour construire n'importe quoi. –

+1

Je vérifie, ça travaille – Anwar

4

Pour C++, vous pouvez faire:

export CXXFLAGS=-m32 

Cela fonctionne avec CMake.

Questions connexes