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
    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


Anmelden zum Antworten