web-dev-qa-db-fra.com

Comment compiler et lier un exécutable Windows 32 bits à l'aide de mingw-w64

J'utilise Ubuntu 13.04 et j'ai installé mingw-w64 en utilisant apt-get install mingw-w64. Je peux compiler et lier une version 64 bits fonctionnelle de mon programme avec la commande suivante:

x86_64-w64-mingw32-g++ code.cpp -o app.exe

Ce qui génère un fichier 64 bits app.exe.

Quels indicateurs binaires ou de ligne de commande dois-je utiliser pour générer une version 32 bits de app.exe?

25
user103935

Cela dépend de la variante de la chaîne d'outils que vous utilisez actuellement. Les deux [~ # ~] nains [~ # ~] et [~ # ~] seh [~ # ~ ] les variantes (qui viennent de GCC 4.8.0) ne sont que des cibles uniques. Vous pouvez le voir vous-même en inspectant la structure de répertoires de leurs distributions, c'est-à-dire qu'elles ne contiennent que les bibliothèques avec un adressage 64 et 32 ​​bits, mais pas les deux. D'un autre côté, les anciennes distributions [~ # ~] sjlj [~ # ~] sont en effet à double cible, et afin de construire 32- bit cible, il suffit de fournir -m32 drapeau. Si cela ne fonctionne pas, compilez simplement avec i686-w64-mingw32-g++.

PRIME


Soit dit en passant, les trois bibliothèques de liens dynamiques correspondantes (DLL) implémentant chacune le modèle d'exception GCC sont

  1. libgcc_s_dw2-1.dll (DWARF);
  2. libgcc_s_seh-1.dll (SEH);
  3. libgcc_s_sjlj-1.dll (SJLJ).

Par conséquent, pour savoir quel modèle d'exception votre distribution MinGW-w64 actuelle fournit exactement, vous pouvez soit

  1. inspecter la structure des répertoires et des fichiers de l'installation de MinGW-w64 dans l'espoir de localiser l'une de ces DLL (généralement dans bin); ou
  2. construire du code C++ réel ou de test impliquant la gestion des exceptions pour forcer la liaison avec l'une de ces DLL, puis voir de quelle DLL dépend la cible construite (par exemple, peut être vu avec Dependency Walker on Les fenêtres); ou
  3. adopter une approche par force brute et compiler du code de test dans Assembly (au lieu du code machine) et rechercher la présence de références comme ___gxx_personality_v* (DWARF), ___gxx_personality_seh* (SEH), ___gxx_personality_sj* (SJLJ); voir Obtention du modèle d'exception GCC actuel .
34