GCC Version 7.3.0 (MinGW) statt 32 nur 64 Bit Compillieren?
-
int main(int argc, char **argv) { std::cout << "GCC-Version: " << __GNUC__ << "."<< __GNUC_MINOR__<<"."<< __GNUC_PATCHLEVEL__ << std::endl; return 0; }
Ich verwende zur Zeit GCC version 7.3.0 bzw. G++. Ich möchte gerne mit der Version 7.3.0 einen 32 Bit Programm erstellen, statt 64:
g++ -m32 main32.cpp -o main32
Wenn ich die Parameter -m32 einstelle, bricht es ab, jedoch nicht die -m64.
Siehe Fehlermeldung: https://pastebin.com/FwWiDpw2
Wer kann mir bitte helfen, wo ich die Version 7.3.0 (GCC-Version: 4.6.1 geht) beide kompilieren kann, 32 und 64 Bit finden kann? Im Netz habe ich nirgendswo gefunden.
-
GCC ist zwar in den x86(_64)-Varianten der Lage, mit
-m32
und-m64
32- und 64-Bit-Code zu generieren, allerdings müssen selbst für ein
simplesstd::cout
jede Menge vorkompilierter Bibliotheken eingebunden werden, die bei deiner Installation offenbar nur in der 64-Bit-Variante
vorliegen und inkompatibel mit 32-Bit-Code sind. Das ist auch das, was der Linker (ld.exe
) dir hier mitteilt: skipping incompatible ... when searching for ...Ich persönlich arbeite nicht mit Setups, bei denen ich mit
-m32
/-m64
zwischen 32-/64-Bit wechseln kann (ich vermute dazu müssen die entsprechenden
Bibliotheken in den/lib32
und/lib64
-Unterverzeichnissen zu finden sein), sondern verwende GCC in diesem Fall in einem Setup wie für einen
Cross-Compiler, als sei 32-Bit eine völlig andere CPU-Architektur:Schau dir mal das Unterverzeichnis an, in dem sich dein GCC-befindet:
x86_64-w64-mingw32
. Dieses Target Triple sagt mir, dass ein Compiler ist, der
Programme für die x86_64-CPU-Architektur erzeugt (also Intel/AMD, 64 Bit), die unter Windows unter Verwendung von MinGW-w64 (C-Standardbibliothek
und GCC-kompatible Bibliotheken für den Zugriff auf die Windows-API) laufen. Dieses Unterverzeichnis enthält üblicherweise ein Komplettpaket (Compiler,
Linker, Assembler, andere Tools und Bibliotheken) für das mit dem Tripel beschriebene Zielsystem.Um 32-Bit-Programme zu erzeugen, empfehle ich dir einfach daneben ein weiteres solches Komplettpaket zu installieren und zwar für
i686-w64-mingw32
.
Das solltest du auch dort finden, wo du den derzeitigen Compiler her hast. Falls du Probleme hast, das wiederzufinden: Eine kurze Google-Suche nach
"x86_64-7.3.0-win32-seh-rt_v5-rev0" hat mir folgende Seite ausgespuckt: https://sourceforge.net/projects/mingw-w64/files/mingw-w64/
Es gibt etliche MinGW-w64-basierte GCC-Distributionen, diese hier ist eine davon. Auf der Seite gibt es einen Installer (MinGW-W64-install.exe
) mit der
sich die verschiedenen Varianten von GCC für Windows herunterladen und installieren lassen.Für 32-Bit-Programme solltest du hier eine Variante für die i686-Architektur auswählen und zusätzlich neben dem bereits vorhanden Compiler installieren,
also z.B. nachC:/mingw-w64/i686-7.3.0-posix-sjlj-rt_v5-rev0
.Allerdings empfehle ich dir, auch den 64-Bit-Compiler neu und in einer anderen Variante zu installieren: Aus dem Installations-Ordner
x86_64-7.3.0-win32-seh-rt_v5-rev0
schließe ich nämlich, dass du eine Version mit Win32-Threads statt mit Posix-Threads installiert hast. Ich bin da nicht
mehr auf dem neuesten Stand, aber vor etwa 2 Jahren war es noch so, dass die C++-Standardbibliothek von GCC,libstdc++
, unter Windows ausschliesslich
Posix-Threads unter der Verwendung vonlibwinpthreads
unterstützt hat. Das hatte zur Folge, dass die C++-Threadunterstützung (std::thread
et al.) mit
Win32-Threads nicht funktioniert hat.Generell empfehle ich folgende Auswahl im Installer:
`
32-Bit:
Architecture: i686
Threads: posix (s.o.)
Exception: sjlj*
64-Bit:
Architecture: x86_64
Threads: posix (s.o.)
Exception: seh
`
* zu
sjlj
: Diese Form von Exception-Handling hat zwar im Gegensatz zudwarf
einen gewissen Overhead, auch wenn keine Exception geworfen wird, allerdings erfordern
Dwarf-Exceptions, dass sämtlicher Code, durch den diese Exceptions laufen mit Dwarf-Exceptions kompiliert wurde. Da einem das bei Verwendung von externen DLLs
oder diversen Windows-API-Funktionen unangenehm (schwer nachvollziehbar) auf die Füße fallen kann, fährt man besonders als Anfänger mit SJLJ-Exceptions besser -
siehe auch https://sourceforge.net/p/mingw-w64/wiki2/Exception%20Handling/Mannomann, mal wieder ein halbes Buch geworden - ich hoffe es bleiben wenigstens keine offenen Fragen
Gruss,
Finnegan