F
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
simples std::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. nach C:/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 von libwinpthreads 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 zu dwarf 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