Mise à jour MinGW

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J’essaie de mettre à jour mon compilateur, j’aimerais passer à C++17 et pouvoir compiler des exécutables 32 et 64 bits.

Jusqu’à aujourd’hui j’avais MinGW32 avec GCC version 5. Le support de C++14 est très partiel et un peu buggé, genre on peut #include<regex> ou #include<mutex> mais ça ne fonctionne pas réellement quand on essaie de les utiliser. <random> n’est pas complet, etc.

Je constate à quel point j’étais dans une grotte… il semblerait que GCC en soit à la version 8 maintenant.

En outre je tombe sur MinGW-W64 et constate que MinGW32 est plus ou moins mort. Seulement, sur le site, il y a 36 prebuild, et je me sens un peu perdu. ON me donne le choix entre posix-thread ou win32-thread, entre seh ou sjsj et je n’ai absolument aucune idée de ce que c’est / ce que ça implique, une fois sur deux je tombe sur des téléchargements datant de 2013, ou incluant sigwin que je ne veux pas… J’ai trouvé un zip qui contient GCC 8.1, la compilation en 64 bits marche mais en 32 (en utilisant le flag -m32) j’ai une erreur de link comme quoi il ne trouve pas les bonnes CRT, donc je n’ai pas pris totalement le bon truc…

Qu’est-ce que je dois télécharger et où ?

  • Je suis sous windows 10 64 bits
  • Je veux compiler des exécutables windows 32 et 64 bits
  • Je veux compiler du C++17 et du C11
  • Je ne veux pas cette m… de sigwin
  • Je ne veux pas cette m… de Visual Studio non plus
  • Si possible, j’aimerais que gdb soit inclus
  • Je n’ai pas besoin de git inclut, il est déjà installé ailleurs
  • et surtout, je n’ai PAS* envie de me casser les pieds à compiler MinGW moi-même

Merci pour votre aide

+0 -0

En ce qui me concerne, j’ai toujours téléchargé MinGW directement depuis ici (ou pour la version 32 bits). On peut télécharger un installeur, mais perso je préfère directement télécharger la bonne version dans un dossier compressé. Jusqu’à maintenant, ça a toujours bien fonctionné et ça ne contient rien de plus que MinGW (pas de Cygwin, de Git ou je ne sais quoi).

Si on ne sait pas trop quelle version choisir, on peut s’aider du nombre de téléchargements affiché sur le côté des dossiers. On choisira donc x86_64-posix-seh pour pour la version 64 bits, ou i686-posix-dwarf pour 32 bits.

Sauf erreur, compiler des applications 32 et 64 bits avec la même version de compilateur risque de pas être évident, notamment à cause du fait que le système de gestion d’exception n’est souvent pas le même, et que certaines libs ne soient pas fournies dans les deux versions. À mon avis, le plus simple reste de télécharger deux versions de MinGW.

Merci pour les réponses et surtout les liens. C’a s’éclaire un peu.

Du coup j’ai déjà pris la version 8.1 indiquée par @Olybri en 64 bits, on verra après si j’ai besoin de la version 32 bits.

Au fait, je vois de temps en temps les gens ici et ailleurs parler de klang, est-ce que c’est mieux que GCC ?

Je fuis mingw à cause de leur install bâclée de gnumake et tourne à cygwin depuis très longtemps.

J’ai jamais réussi à faire bien fonctionner make et autres outils de build genre autoconf et cmake de toute façon, du coup je m’en fiche, ne n’en ai pas besoin. Si je prends du code extérieur et que ça ne passe pas avec g++ *.cpp + quelques options rapidement tweakées dans les headers, via #define ou -D, je passe à autre chose.

Et au contraire cygwin, pour les fois il était inclus dans le package, il a toujours foutu un peu la m… a pseudo-simuler linux quand ça n’a pas lieu d’être.

C’est dommage que ce soit toujours aussi compliqué avec les libristes, ils font 36 distributions de presque la même chose.

Sauf erreur, compiler des applications 32 et 64 bits avec la même version de compilateur risque de pas être évident, notamment à cause du fait que le système de gestion d’exception n’est souvent pas le même, et que certaines libs ne soient pas fournies dans les deux versions. À mon avis, le plus simple reste de télécharger deux versions de MinGW.

Ah bon ?

Mais alors, dans ce cas, à quoi sert le flag -m32 ?

N’y a-t-il vraiment pas moyen de compiler en 32 et 64 avec la même version ?

Pour info, voici ce que j’obtiens comme erreurs quand je tente de compiler avec -m32:

c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../libstdc++.a when searching for -lstdc++
c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../..\libstdc++.a when searching for -lstdc++
c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../libstdc++.a when searching for -lstdc++
c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lstdc++
... plein d'autres lignes similaires ...
c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib/libmsvcrt.a when searching for -lmsvcrt
c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib\libmsvcrt.a when searching for -lmsvcrt
c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib/libmsvcrt.a when searching for -lmsvcrt
c:/mingw-w64/mingw/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lmsvcrt
collect2.exe: error: ld returned 1 exit status

Pour ce programme:

#include<iostream>
#include<vector> // c'est juste pour être sûr d'avoir size_t
using namespace std;

int main (int argc, char** argv) {
cout << sizeof(size_t) << endl;
return 0;
}
+0 -0

Si j’ai bien compris, le flag -m32 indique au compilateur de créer des objets en 32 bits. Visiblement, le problème vient au moment du linkage, car la bibliothèque standard (libstdc++.a) fournie avec MinGW a déjà été compilée au préalable en 64 bits uniquement. Résultat : le linker cherche un peu partout et finit par ne trouver aucune version de la bibliothèque en 32 bits.

Donc pour résoudre le problème : soit on recompile soi-même la libstdc++ en 32 bits, soit on prend un MinGW 32 bits avec la lib déjà compilée dans la bonne architecture.

Le lien indiqué par Olybri est plutôt bien je trouve.

Pour ma part j’utilise l’installeur, il permet de choisir et tester plusieurs options si on veut, et de les installer côte à côte chacune dans son dossier. Il met à jour son catalogue tout seul aussi quand y’a de nouvelles versions :-)

Pour les options, je te conseille les exceptions SEH en 64bits, et pour les threads ça ne fait pas grande différence (prend du posix si tu fais du code portable, et win32 si tu veux t’incorporer à des produits Windows).

Idem que @Olybri, je te conseille simplement d’installer 2 MinGW pour 32 et 64 bits. L’installateur est pratique de ce côté là.

+0 -0

Donc pour résoudre le problème : soit on recompile soi-même la libstdc++ en 32 bits, soit on prend un MinGW 32 bits avec la lib déjà compilée dans la bonne architecture.

OK. Donc effectivement comme vous dites, je suis obligé de télécharger les deux versions. Dommage, ça aurait été pratique d’en avoir qu’une seule qui fait les deux.

Pour les options, je te conseille les exceptions SEH en 64bits, et pour les threads ça ne fait pas grande différence (prend du posix si tu fais du code portable, et win32 si tu veux t’incorporer à des produits Windows).

D’accord, du coup ça sera win32 pour moi.

Merci. Sujet résolu.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte