So kompilieren Sie eine 32-Bit-Binärdatei auf einem 64-Bit-Linux-Computer mit gcc / cmake

129

Ist es möglich, ein Projekt in 32-Bit mit cmakeund gccauf einem 64-Bit- System zu kompilieren ? Es ist wahrscheinlich, aber wie mache ich das?

Als ich es auf "ignorante" Weise versuchte, ohne Parameter / Flags / usw. festzulegen, schien es nur zu ignorieren, nur LD_LIBRARY_PATHdie verknüpften Bibliotheken ~/tools/libdarin zu finden, und nur in Unterverzeichnissen mit dem Namen lib64 zu suchen .

Dala
quelle
1
Wäre es ausreichend, das Flag -m32 an gcc zu übergeben? Wie würde ich das dann in cmake machen?
Dala

Antworten:

124
export CFLAGS=-m32
caf
quelle
2
Es sollte reichen. Sie könnten auch die cmake Skript ändern , um ein 32 - Bit - Ziel zu schaffen - es wäre einfach hinzufügen -m32zu der CFLAGS, die wahrscheinlich durch Einstellung CMAKE_REQUIRED_FLAGS.
Café
5
Das Problem ist, dass dies natürlich nicht unbedingt ausreicht. Möglicherweise müssen Sie auch den Linker optimieren!
lpapp
6
Was heißt exportdas Wo gehört es hin? Die Header-Dateien? Die makefile? Nein, für mich als Anfänger überhaupt keine Antwort.
Tomáš Zato - Wiedereinsetzung Monica
1
@ TomášZato: An der Shell-Eingabeaufforderung vor dem Aufrufen cmake(in Ihrem Fall jedoch, wenn Sie ein Makefile haben, würden Sie makestattdessen verwenden).
Café
4
@caf, könnten Sie bitte Ihre Antwort näher erläutern? Ihre Antwort ist sehr knapp und erklärt nichts.
Bulat M.
76
$ gcc test.c -o testc
$ file testc
testc: ELF 64-Bit-LSB-ausführbare Datei, x86-64, Version 1 (SYSV), dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken), für GNU / Linux 2.6.9, nicht entfernt
$ 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-ausführbare Datei, Intel 80386, Version 1 (SYSV), dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken), für GNU / Linux 2.6.9, nicht entfernt
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2 (0x0075b000)

Kurz gesagt: Verwenden Sie das -m32Flag, um eine 32-Bit-Binärdatei zu kompilieren.

Stellen Sie außerdem sicher, dass Sie die 32-Bit-Versionen aller erforderlichen Bibliotheken installiert haben (in meinem Fall war alles, was ich auf Fedora benötigte, glibc-devel.i386).

andri
quelle
1
Vielen Dank! Ja, ich habe 32-Bit-Versionen der Abhängigkeiten.
dala
6
Wie kann ich 32-Bit-Versionen der Bibliotheken installieren?
Tomáš Zato - Wiedereinsetzung Monica
2
@ TomášZatosudo apt-get install gcc-multilib
Matthew Murdoch
16

In späteren Versionen von CMake besteht eine Möglichkeit, dies auf jedem Ziel zu tun, darin:

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

Ich kenne keinen Weg, dies global zu tun.

Nathan Monteleone
quelle
+1. Ich versuche, eine 32-Bit-Taglib ( developer.kde.org/~wheeler/taglib.html ) auf einem 64-Bit-Schneeleoparden zu erstellen . Das funktioniert bei mir.
Edwardw
3
cmake -D CMAKE_CXX_FLAGS=-m32 . && make
Um
7

Für C ++ können Sie Folgendes tun:

export CXXFLAGS=-m32

Dies funktioniert mit cmake.

Eukken
quelle
6

Eine Möglichkeit besteht darin, eine Chroot-Umgebung einzurichten. Debian hat dafür eine Reihe von Tools, zum Beispiel Debootstrap

Dirk Eddelbuettel
quelle
2
Es fühlt sich ein bisschen extrem an, eine Chroot-Umgebung einzurichten, nur um 32-Bit-Apps zu erstellen, nicht wahr? Gibt es einen bestimmten Grund, warum Sie das empfehlen?
Fredrik
3
Es bietet Ihnen eine vollständige Umgebung, in der Sie auch Code ausführen können. Wir verwenden dies, um vollständige 32-Bit-Binärdateien auf 64-Bit-Hosts zu erstellen (und auszuführen) - manchmal erhalten Sie nur 32-Bit-Builds von Bibliotheken von Drittanbietern. Für die Debian-Arbeit verwenden wir es, um 32-Bit-Pakete auf 64-Bit-Hosts zu erstellen.
Dirk Eddelbuettel
Ich habe noch nie Probleme beim Erstellen und Ausführen vollständiger 32-Bit-Binärdateien unter Linux, Solaris oder einer anderen 64-Bit-Plattform gehabt. Aber ich benutze Debian nicht viel.
Fredrik
Frederik, stellen Sie sie auch in 32-Bit auf dem 64-Bit-Build-Host bereit?
Dirk Eddelbuettel
@Dirk: Die 32-Bit-Binärdateien funktionieren sowohl auf 32- als auch auf 64-Bit-Computern (natürlich), die 64-Bit-Binärdateien funktionieren nur auf 64-Bit-Computern. Es spielt keine Rolle, ob es sich um einen Kundencomputer oder einen Build-Host handelt. Ich sehe ehrlich gesagt nicht, wo das Problem liegen würde, es sei denn, es sind Kernelmodule, die Sie erstellen.
Fredrik
6

Für jede komplexe Anwendung empfehle ich die Verwendung eines lxc-Containers . lxc-Container sind "etwas in der Mitte zwischen einer Steroid-Chroot und einer vollwertigen virtuellen Maschine".

Hier ist beispielsweise eine Möglichkeit, 32-Bit-Wein mit lxc auf einem Ubuntu Trusty-System zu erstellen:

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

Hier ist die Wiki-Seite zum Erstellen von 32-Bit-Wein auf einem 64-Bit-Host mit lxc .

Sam Watkins
quelle
interessant. Kann ich damit einen atomTexteditor für 32-Bit in einem 64-Bit-Computer kompilieren ?
Anwar
1
@Anwar, ich denke schon. Es sollte funktionieren, um etwas zu bauen.
Sam Watkins