
Ich habe also ein Projekt, das ich sowohl als 64-Bit-Binärdatei als auch als 32-Bit-Binärdatei erstellen möchte.
Meine Maschine selbst ist 64-Bit und die 64-Bit-Kompilierung funktioniert problemlos.
Ich verwende cake
zum Erstellen meines Projekts und habe es verwendet, set_target_properties(clib PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
um einen 32-Bit-Build zu erzwingen.
Immer wenn ich versuche, dies zu erstellen, gibt der Compiler einen Fehler aus, weil ich es <iostream>
in mein Hauptprogramm einbinde. Zuerst beschwerte er sich, dass er nicht finden konnte, <bits/c++config.h>
was irgendwo in enthalten ist <iostream>
.
Ich fand ein paar Dinge online, die mich dazu veranlassten, es g++-multilib
auf meinem System zu installieren. Jetzt ist der vorherige Fehler weg, aber stattdessen erhalte ich den Fehler
/usr/include/linux/errno.h:1:10: fatal error: asm/errno.h: No such file or directory
, der ebenfalls seinen Ursprung in hat #include <iostream>
.
Ich habe nachgeschaut, wo sich diese Datei befindet, und ich habe sie gefunden, /usr/include/x86_64-linux-gnu/asm/errno.h
aber (wie zuvor beim c++config.h
Ordner x86_64
scheint dieser in einer 32-Bit-Version nicht durchsucht zu werden (was irgendwie Sinn macht).
Ich habe sie auch in einem Ordner gefunden, /usr/include/linux/errno.h
der mit dem vorherigen identisch ist, aber wie Sie sehen, befindet sie sich nicht im asm
Unterordner.
Natürlich könnte ich sie manuell in diesen Ordner verschieben, aber ich habe das Gefühl, dass mit meinem Setup hier etwas generell nicht stimmt.
Was muss ich also sonst noch einrichten, damit ich meinen Code (mit einem #include <iostream>
) als 32-Bit-ausführbare Datei kompilieren kann? Gibt es so etwas wie eine 32-Bit-Version der Standardbibliothek?
EDIT:
Ich verwende Linux Mint 18.3 mit g++ --version
of g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
undcmake v.3.10.2
Antwort1
Okay, ich habe herausgefunden, wo das Problem lag:
Als ich herausfand, dass ich verwenden musste, g++-multilib
suchte ich in meinem Paketmanager danach ( synaptic
in meinem Fall). Dieser listete eine Reihe von Versionen auf, also überprüfte ich, welche Version von g++
ich installiert hatte, und installierte dann das entsprechende g++-multilib
-Paket, das in meinem Fall das war g++-7-multilib
.
Was jedoch nicht installiert wurde, war das gcc-multilib
Paket, das in meinem Fall der Störenfried zu sein scheint. Nachdem ich dieses installiert hatte, funktionierte es wie erwartet.
Kurz gesagt: Wenn ich das g++-multilib
Paket (ohne Version im Namen) von Anfang an installiert hätte, hätte ich dieses Problem nicht gehabt.