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

129

Est-il possible de compiler un projet en 32 bits avec cmakeet gccsur un système 64 bits ? C'est probablement le cas, mais comment faire?

Quand je l'ai essayé de manière "ignorante", sans définir de paramètres / drapeaux / etc, le simple fait LD_LIBRARY_PATHde trouver les bibliothèques liées ~/tools/libsemble l'ignorer et de ne regarder que dans les sous-répertoires nommés lib64 .

dala
la source
1
Serait-il suffisant de passer le drapeau -m32 à gcc? Comment puis-je faire cela dans cmake?
dala

Réponses:

124
export CFLAGS=-m32
caf
la source
2
Ça devrait faire. Vous pouvez également modifier le script cmake pour créer une cible 32 bits - il s'ajouterait simplement -m32au CFLAGS, probablement en définissant CMAKE_REQUIRED_FLAGS.
caf
5
Eh bien, le problème est que ce n'est bien sûr pas nécessairement suffisant. Vous devrez peut-être également modifier l'éditeur de liens!
lpapp
6
Que veut exportdire? Où appartient-il? Les fichiers d'en-tête? Le makefile? Non, pas du tout une réponse pour moi en tant que débutant.
Tomáš Zato - Réintégrer Monica le
1
@ TomášZato: À l'invite du shell, avant d'appeler cmake(mais dans votre cas, si vous avez un Makefile, vous utiliserez à la makeplace).
caf du
4
@caf, pourriez-vous préciser votre réponse? Votre réponse est très concise et n'explique rien.
Bulat M.
76
$ gcc test.c -o testc
$ fichier testc
testc: exécutable ELF 64 bits LSB, x86-64, version 1 (SYSV), lié dynamiquement (utilise des bibliothèques partagées), pour GNU / Linux 2.6.9, non supprimé
$ 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 LSB, Intel 80386, version 1 (SYSV), lié dynamiquement (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 l' -m32indicateur pour compiler un 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)

andri
la source
1
Grand merci! Oui, j'ai des versions 32 bits des dépendances.
dala
6
Comment puis-je installer des versions 32 bits des bibliothèques?
Tomáš Zato - Réintégrer Monica le
2
@ TomášZatosudo apt-get install gcc-multilib
Matthew Murdoch
16

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 à l'échelle mondiale.

Nathan Monteleone
la source
+1. J'essaie de créer un taglib 32 bits ( developer.kde.org/~wheeler/taglib.html ) sur un léopard des neiges 64 bits. Cela fonctionne pour moi.
edwardw
3
… Pour le faire globalement:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas
7

Pour C ++, vous pouvez faire:

export CXXFLAGS=-m32

Cela fonctionne avec cmake.

euccas
la source
6

Une façon est de configurer un environnement chroot. Debian a un certain nombre d'outils pour cela, par exemple debootstrap

Dirk Eddelbuettel
la source
2
C'est un peu extrême de configurer un environnement chroot juste pour créer des applications 32 bits, n'est-ce pas? Une raison particulière pour laquelle vous recommandez cela?
Fredrik
3
Il vous donne un environnement complet dans lequel exécuter également du code. Nous utilisons cela pour créer (et exécuter) des binaires 32 bits complets sur des hôtes 64 bits - parfois, vous n'obtenez que 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.
Dirk Eddelbuettel
Je n'ai jamais rencontré de problèmes pour construire et exécuter des binaires 32 bits complets ni sur Linux, ni sur Solaris, ni sur aucune autre plate-forme 64 bits. Mais je n'utilise pas beaucoup Debian.
Fredrik
Frederik, les déployez-vous également en 32 bits sur l'hôte de build 64 bits?
Dirk Eddelbuettel
@Dirk: les binaires 32 bits fonctionnent sur les machines 32 et 64 bits (bien sûr), les binaires 64 bits ne fonctionnent que sur les machines 64 bits. Peu importe qu'il s'agisse d'une machine cliente ou d'un hôte de build. Honnêtement, je ne vois pas où serait le problème à moins que ce ne soit des modules du noyau que vous construisez.
Fredrik
6

Pour toute application complexe, je suggère d'utiliser un conteneur lxc . 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 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 sur la façon de construire du vin 32 bits sur un hôte 64 bits en utilisant lxc .

Sam Watkins
la source
intéressant. Puis-je l'utiliser pour compiler un atoméditeur de texte pour 32 bits sur une machine 64 bits?
Anwar
1
@Anwar, je suppose. Cela devrait fonctionner pour construire quoi que ce soit.
Sam Watkins