Quelle est la différence entre Cygwin et MinGW?

658

Je veux faire de mon projet C ++ une plateforme croisée, et j'envisage d'utiliser Cygwin / MinGW. Mais quelle est la différence entre eux?

Une autre question est de savoir si je pourrai exécuter le binaire sur un système sans Cygwin / MinGW?

Łukasz Lew
la source

Réponses:

629

Pour simplifier, c'est comme ça:

  • Compilez quelque chose dans Cygwin et vous le compilez pour Cygwin .

  • Compilez quelque chose dans MinGW et vous le compilez pour Windows .

À propos de Cygwin

Le but de Cygwin est de faciliter le portage des applications basées sur Unix vers Windows, en émulant la plupart des petits détails fournis par les systèmes d'exploitation basés sur Unix et qui sont documentés par les normes POSIX . Votre application peut utiliser la fonction Unix tels que des tuyaux, de fichiers Unix et l' accès au répertoire, et ainsi de suite, et il peut être compilé avec Cygwin qui agira en tant que couche de compatibilité autour de votre application, de sorte que beaucoup de ces paradigmes spécifiques Unix peuvent continuer à être utilisé.

Lorsque vous distribuez votre logiciel, le destinataire devra l'exécuter avec l'environnement d'exécution Cygwin (fourni par le fichier cygwin1.dll). Vous pouvez distribuer cela avec votre logiciel, mais votre logiciel devra se conformer à sa licence open source. Il se peut même que même en reliant simplement votre logiciel à celui-ci, mais en distribuant la DLL séparément, vous devrez peut-être honorer la licence open source.

À propos de MinGW

MinGW vise simplement à être un port Windows des outils du compilateur GNU, tels que GCC, Make, Bash, etc. Il n'essaie pas d'émuler ou de fournir une compatibilité complète avec Unix, mais à la place, il fournit l'environnement minimum nécessaire pour utiliser GCC (le compilateur GNU) et un petit nombre d'autres outils sous Windows.. Il n'a pas de couche d'émulation Unix comme Cygwin, mais en conséquence, votre application doit être spécifiquement programmée pour pouvoir s'exécuter dans Windows, ce qui peut signifier une modification importante si elle a été créée pour pouvoir être exécutée dans un environnement Unix standard et utilise des fonctionnalités spécifiques à Unix telles que celles mentionnées précédemment. Par défaut, le code compilé dans le GCC de MinGW sera compilé vers une cible Windows X86 native, y compris les fichiers .exe et .dll, bien que vous puissiez également effectuer une compilation croisée avec les bons paramètres, car vous utilisez essentiellement la suite d'outils de compilation GNU.

MinGW est essentiellement une alternative au compilateur Microsoft Visual C ++ et à ses outils de liaison / création associés. Il peut être possible dans certains cas d'utiliser MinGW pour compiler quelque chose qui était destiné à être compilé avec Microsoft Visual C ++, avec les bonnes bibliothèques et dans certains cas avec d'autres modifications.

MinGW comprend quelques bibliothèques standard de base pour interagir avec le système d'exploitation Windows, mais comme avec les bibliothèques standard normales incluses dans la collection de compilateurs GNU, elles n'imposent pas de restrictions de licence sur les logiciels que vous avez créés.

Pour les applications logicielles non triviales, les rendre multiplateformes peut être un défi considérable à moins que vous n'utilisiez un cadre multiplateforme complet. Au moment où j'ai écrit cela, le framework Qt était l'un des plus populaires à cet effet, permettant la construction d'applications graphiques qui fonctionnent sur tous les systèmes d'exploitation, y compris Windows, mais il existe également d'autres options. Si vous utilisez un tel framework depuis le début, vous pouvez non seulement réduire vos maux de tête quand vient le temps de porter sur une autre plateforme, mais vous pouvez utiliser les mêmes widgets graphiques - fenêtres, menus et contrôles - sur toutes les plateformes si vous écrivez un GUI app, et les faire apparaître natif pour l'utilisateur.

thomasrutter
la source
43
Le bash fourni avec MinGW n'est pas un programme Windows natif. Cela dépend de la DLL MSYS, qui est un fork de la DLL Cygwin. De même pour la plupart des autres utilitaires Unix fournis avec MinGW / MSYS. MinGW gcc est en effet un programme natif. Make est disponible à la fois dans une version native et dans une version MSYS.
ak2
6
des différences de vitesse?
EKanadily
6
La différence de vitesse sera ignorable dans la plupart des situations. Toute différence se résumera à combien le niveau supplémentaire d'abstraction fourni par la couche de compatibilité cygwin ralentit les choses. Cela peut avoir un effet mesurable sur des choses comme les E / S. Par exemple, il y a longtemps, Git ne fonctionnait que sur Windows dans cygwin, et à cause de cela, il était un peu plus lent. Là encore, si vous codez en utilisant un framework, c'est aussi une couche d'abstraction avec le potentiel de ralentir certaines choses de toute façon.
thomasrutter
28
Je dois noter que le code compilé pour cygwin est toujours du code natif - il n'a pas besoin de passer par un interpréteur comme disons Java. C'est juste que lorsqu'il a besoin d'interagir avec certaines fonctionnalités du système d'exploitation comme le disque / fichier, il passe par une autre couche.
thomasrutter
4
Généralement, vous ne pourriez pas comparer, car vous devez écrire votre code différemment selon qu'il s'agit de cygwin ou non. Bien que pour tout petit logiciel simple comme "hello world", l'équivalent cygwin ne soit plus grand qu'en raison de la bibliothèque d'exécution cygwin. Si vous ne comptez pas la taille de la bibliothèque d'exécution de cygwin, la version de cygwin sera généralement plus petite, mais c'est un faux chiffre, je pense, car la bibliothèque devra pratiquement toujours être fournie avec le logiciel. Cela dit, si vous utilisez des bibliothèques / frameworks non triviaux, cela dépendra davantage de cela.
thomasrutter
311

Cygwin est une tentative de création d'un environnement UNIX / POSIX complet sous Windows. Pour ce faire, il utilise diverses DLL. Bien que ces DLL soient couvertes par GPLv3 +, leur licence contient une exception qui ne force pas un travail dérivé à être couvert par la GPLv3 +. MinGW est une suite de compilateurs C / C ++ qui vous permet de créer des exécutables Windows sans dépendance sur de telles DLL - vous n'avez besoin que des runtimes MSVC normaux, qui font partie de toute installation Microsoft Windows normale.

Vous pouvez également obtenir un petit environnement de type UNIX / POSIX, compilé avec MinGW appelé MSYS . Il n'a pas du tout toutes les fonctionnalités de Cygwin, mais est idéal pour les programmeurs qui souhaitent utiliser MinGW.

Cole Johnson
la source
59
Mais si je veux publier un logiciel non GPL gratuit? Désolé, je ne suis pas fan de la GPL, c'est tout.
19
@Dan Vous n'avez pas besoin de redistribuer le runtime utilisé par MinGW - cela fait partie de Windows.
14
@ ak2: c'est vrai, mais trompeur. L'environnement cygwyn gcc + cygwin utilise par défaut la production de binaires liés à la dll cygwin (GPL). mingw + msys utilise par défaut la production de binaires liés à la plateforme C lib.
Sean McMillan
4
@DanMoulding Si vous n'êtes pas un fan de Microsoft, vous devrez ignorer ces sentiments pour développer pour Windows en premier lieu. ;-)
Arda Xi
14
@anon "Mais si je veux publier des logiciels non-GPL gratuits?" .. cygwin a une exception spéciale dans ses conditions de licence qui vous permet de distribuer des logiciels libres qui y sont liés sous d'autres licences open-source (non-GPL). Voir "Exception de licence Open Source" ici: cygwin.com/licensing.html
steve cook
138

Pour ajouter aux autres réponses, Cygwin est livré avec les bibliothèques et en-têtes MinGW et vous pouvez compiler sans créer de lien vers cygwin1.dll en utilisant l'option -mno-cygwin avec gcc. Je préfère grandement cela à l'utilisation de MinGW et MSYS standard.

TrayMan
la source
31
Cela ne fonctionne plus avec cygwin 1.7.6. gcc: le drapeau -mno-cygwin a été supprimé; utiliser un compilateur croisé ciblé par mingw.
sigjuice
2
@sigjuice: vrai, mais l'ancien drapeau -mno-cygwin fonctionne toujours pour GCC 3.x:gcc-3 -mno-cygwin
Amro
1
Est-ce que cela signifie que je dois télécharger les bibliothèques mingw depuis le site officiel de mingw afin de compiler vers une cible mingw à partir d'un hôte cygwin? Ou ces bibliothèques peuvent-elles être téléchargées à partir du système de packages de Cygwin?
CMCDragonkai
5
@CMCDragonkai Vous pouvez acquérir des compilateurs compatibles mingw sur le site Cygwin en exécutant l'utilitaire de configuration et en les trouvant et en les cochant. Ainsi, même si gcc ne génère plus de code compatible avec mingw, vous pouvez dans Cygwin exécuter un "mingw-gcc" (ce n'est pas le nom complet) pour créer le même type d'exécutable que le compilateur mingw sous msys.
Space Man à Cardiff le
9
Pour modifier la réponse utile de cardiff, les packages et commandes MinGW de Cygwin ont des noms quelque peu obscurs. Pour installer MinGW-64 (à peu près ce que vous voulez toujours de nos jours ), installez le mingw64-x86_64-gcc-corepackage Cygwin. MinGW-64 sera alors disponible en tant que x86_64-w64-mingw32-gcccommande mal nommée . S'il vous plaît Dieu (s), quelqu'un unifie déjà les noms de ces choses sanglantes.
Cecil Curry
60

Wikipédia fait une comparaison ici .

Depuis le site Web de Cygwin :

  • Cygwin est un environnement de type Linux pour Windows. Il se compose de deux parties: une DLL (cygwin1.dll) qui agit comme une couche d'émulation d'API Linux fournissant des fonctionnalités d'API Linux substantielles.
  • Une collection d'outils qui fournissent l'apparence de Linux.

Du site Web de Mingw :

MinGW ("Minimalistic GNU for Windows") est une collection de fichiers d'en-tête spécifiques à Windows disponibles gratuitement et librement distribuables et des bibliothèques d'importation combinées avec des jeux d'outils GNU qui permettent de produire des programmes Windows natifs qui ne dépendent d'aucune DLL d'exécution C tierce

dirkgently
la source
47

Cygwin utilise une DLL, cygwin.dll (ou peut-être un ensemble de DLL) pour fournir un runtime de type POSIX sur Windows.

MinGW compile dans une application Win32 native.

Si vous construisez quelque chose avec Cygwin, tout système sur lequel vous l'installez aura également besoin des DLL Cygwin. Une application MinGW ne nécessite aucun runtime spécial.

Michael Burr
la source
42

Lisez ces réponses aux questions pour comprendre la différence entre Cygwin et MinGW.


Question # 1: Je veux créer une application que j'écris une fois le code source, le compile une fois et l'exécute sur toutes les plates-formes (par exemple Windows, Linux et Mac OS X…).

Réponse # 1: Écrivez votre code source dans JAVA. Compilez le code source une fois et exécutez-le n'importe où.


Question # 2: Je veux créer une application que j'écris une fois le code source mais il n'y a aucun problème que je compile le code source pour toutes les plates-formes séparément (par exemple Windows, Linux et Mac OS X…).

Réponse # 2: Écrivez votre code source en C ou C ++. Utilisez uniquement des fichiers d'en-tête standard. Utilisez un compilateur approprié pour n'importe quelle plate-forme (par exemple Visual Studio pour Windows, GCC pour Linux et XCode pour Mac). Notez que vous ne devez pas utiliser de fonctionnalités de programmation avancées pour compiler votre code source sur toutes les plates-formes avec succès. Si vous n'utilisez aucune classe ou fonction standard C ou C ++, votre code source ne se compile pas sur d'autres plates-formes.


Question # 3: En réponse à la question # 2, il est difficile d'utiliser un compilateur différent pour chaque plateforme, existe-t-il un compilateur multi-plateforme?

Réponse # 3: Oui, utilisez le compilateur GCC. Il s'agit d'un compilateur multiplateforme. Pour compiler votre code source dans Windows, utilisez MinGW qui fournit le compilateur GCC pour Windows et compile votre code source dans un programme Windows natif. N'utilisez aucune fonctionnalité de programmation avancée (comme l'API Windows) pour compiler votre code source sur toutes les plates-formes avec succès. Si vous utilisez les fonctions de l'API Windows, votre code source ne se compile pas sur d'autres plates-formes.


Question # 4: Les fichiers d'en-tête standard C ou C ++ ne fournissent aucune fonctionnalité de programmation avancée comme le multi-threading. Que puis-je faire?

Réponse # 4: Vous devez utiliser la norme POSIX (Portable Operating System Interface [for UNIX]). Il fournit de nombreuses fonctionnalités et outils de programmation avancés. De nombreux systèmes d'exploitation totalement ou partiellement compatibles POSIX (comme Mac OS X, Solaris, BSD / OS et ...). Certains systèmes d'exploitation, bien qu'ils ne soient pas officiellement certifiés compatibles POSIX, sont en grande partie conformes (comme Linux, FreeBSD, OpenSolaris et ...). Cygwin fournit un environnement de développement et d'exécution largement compatible POSIX pour Microsoft Windows.


Donc:

Pour utiliser l'avantage du compilateur multiplateforme GCC sous Windows, utilisez MinGW.

Pour utiliser les fonctionnalités et outils de programmation avancée standard POSIX sous Windows, utilisez Cygwin.

Amir Saniyan
la source
4
À propos de votre petite FAQ: 1) Votre droit, si vous avez besoin de quelque chose qui s'exécute n'importe où et n'a pas besoin d'être compilé, choisissez quelque chose comme java (n'oubliez pas non plus python, perl, ruby ​​et le reste des langages de script) 2) C'est quelque peu faux pour le cas de C, car tous les compilateurs de C le supportent très bien. 3) Vous pouvez toujours utiliser l'api win32, mais vous devez l'envelopper dans une couche de portabilité, ce n'est donc qu'un problème de conception.
Coyote21
1
4) C'est totalement faux, pour les raisons que je donne ci-dessus, puisque POSIX n'est qu'un autre api, aussi si vous défendez autant de POSIX, vous devez savoir que même les Unices n'ont pas besoin d'implémenter le même ensemble de POSIX, alors comment gérez-vous cela? L'API POSIX en temps réel me vient à l'esprit. Et cela vous rend la conclusion complètement fausse et erronée, car vous n'avez besoin de POSIX pour rien dans Windows, vous pouvez simplement utiliser l'API Win32. Ou comment pensez-vous que Qt, GTK et WxWidgets ont trouvé un moyen d'être multiplateforme, je suppose qu'ils doivent tous utiliser cygwin dans Windows. -1 vote pour votre réponse.
Coyote21
4
Je ne comprends pas votre argument, @ Coyote21. Êtes-vous en train de dire que POSIX ne convient pas au développement multiplateforme? Voulez-vous dire que la seule façon appropriée d'écrire du code en C / C ++ pour plusieurs plates-formes est d'écrire votre propre couche de compatibilité pour chaque plate-forme que vous souhaitez prendre en charge? Je ne vois rien de mal à la suggestion de commencer avec POSIX. Vous devez voir jusqu'où cela peut vous mener et si une solution de couche de compatibilité étendue sera requise. Les grandes couches de compatibilité ne sont pas la norme. Dire le contraire revient à affirmer que POSIX est un échec complet.
David Gladfelter
Le multithreading est implémenté via la couche POSIX même dans MinGW.
Alexander Shishenko
1
"vous ne devez pas utiliser de fonctionnalités de programmation avancées pour compiler votre code source sur toutes les plates-formes avec succès." Vous devez vraiment clarifier ce que vous entendez par "fonctionnalités de programmation avancées". Sur la base d'une ligne ultérieure, je suppose que vous voulez dire des fonctionnalités spécifiques à la plate-forme . Si vous vouliez parler de fonctionnalités de langage moderne, alors non, car des compilateurs compétents existent pour "toutes les [principales] plates-formes", et nous ne devons pas nous priver de fonctionnalités uniquement pour soutenir celles dont les compilateurs ou les bibliothèques sont encore à la traîne. Avec un compilateur décent, C standard / ++ et les bibliothèques multi-plateforme, nous pouvons être beaucoup avancé.
underscore_d
34

Du point de vue du portage d'un programme C, un bon moyen de comprendre cela est de prendre un exemple:

#include <sys/stat.h>
#include <stdlib.h>

int main(void)
{
   struct stat stbuf;
   stat("c:foo.txt", &stbuf);
   system("command");
   printf("Hello, World\n");
   return 0;
}

Si nous passons statà _stat, nous pouvons compiler ce programme avec Microsoft Visual C. Nous pouvons également compiler ce programme avec MinGW et avec Cygwin.

Sous Microsoft Visual C, le programme sera lié à une bibliothèque d'exécution redistribuable MSVC: mxvcrtnn.dll où se nntrouve un suffixe de version. Pour expédier ce programme, nous devrons inclure cette DLL. Cette DLL fournit _stat, systemet printf. (Nous avons également la possibilité de lier statiquement le temps d'exécution.)

Sous MinGW, le programme sera lié à msvcrt.dll, qui est une bibliothèque interne, non documentée et non versionnée qui fait partie de Windows et interdite à l'utilisation des applications. Cette bibliothèque est essentiellement un fork de la bibliothèque d'exécution redistribuable de MS Visual C pour une utilisation par Windows lui-même.

Dans les deux cas, le programme aura des comportements similaires:

  • la statfonction renverra des informations très limitées - pas d'autorisations utiles ou de numéro d'inode, par exemple.
  • le chemin c:file.txt est résolu en fonction du répertoire de travail actuel associé au lecteur c:.
  • system les usages cmd.exe /c pour exécuter la commande externe.

Nous pouvons également compiler le programme sous Cygwin. De manière similaire à l'exécution redistribuable utilisée par MS Visual C, le programme Cygwin sera lié aux bibliothèques d'exécution de Cygwin:cygwin1.dll (Cygwin proprement dit) et cyggcc_s-1.dll(prise en charge de l'exécution GCC). Puisque Cygwin est maintenant sous LGPL, nous pouvons emballer avec notre programme, même si ce n'est pas un logiciel gratuit compatible GPL, et expédier le programme.

Sous Cygwin, les fonctions de la bibliothèque se comporteront différemment:

  • le stat fonction a des fonctionnalités riches, renvoyant des valeurs significatives dans la plupart des champs.
  • le chemin c:file.txt n'est pas du tout compris comme contenant une référence de lettre de lecteur, car il c:n'est pas suivi d'une barre oblique. Le côlon est considéré comme faisant partie du nom et en quelque sorte mutilé. Il n'y a aucun concept de chemin relatif par rapport à un volume ou un lecteur dans Cygwin, aucun concept de "lecteur actuellement connecté" et aucun répertoire de travail actuel par lecteur.
  • la systemfonction essaie d'utiliser l' /bin/sh -cinterpréteur. Cygwin résoudra le /chemin en fonction de l'emplacement de votre exécutable et s'attend à ce qu'un sh.exeprogramme soit colocalisé avec votre exécutable.

Cygwin et MinGW vous permettent d'utiliser les fonctions Win32. Si vous souhaitez appeler MessageBoxou CreateProcess, vous pouvez le faire. Vous pouvez également facilement créer un programme qui ne nécessite pas de fenêtre de console, en utilisantgcc -mwindows , sous MinGW et Cygwin.

Cygwin n'est pas strictement POSIX. En plus de fournir un accès à l'API Windows, il fournit également ses propres implémentations de certaines fonctions Microsoft C (des éléments trouvés dans msvcrt.dllou les temps d' msvcrtnn.dllexécution redistribuables ). Un exemple de ceci est la spawn*famille de fonctions comme spawnvp. Il s'agit d'une bonne idée à utiliser à la place de forket execsur Cygwin car ils correspondent mieux au modèle de création de processus Windows qui n'a pas de concept fork.

Donc:

  • Les programmes Cygwin ne sont pas moins «natifs» que les programmes MS Visual C car ils nécessitent l’accompagnement de bibliothèques. Les implémentations du langage de programmation sous Windows devraient fournir leur propre exécution, même les implémentations du langage C. Il n'y a pas de "libc" sous Windows pour un usage public.

  • Le fait que MinGW ne nécessite aucune DLL tierce est en fait un inconvénient; il dépend d'un fork non documenté, interne à Windows, de l'exécution de Visual C. MinGW le fait car l'exception de la bibliothèque système GPL s'applique à msvcrt.dll, ce qui signifie que les programmes GPL peuvent être compilés et redistribués avec MinGW.

  • En raison de sa prise en charge beaucoup plus large et approfondie de POSIX par rapport à msvcrt.dll, Cygwin est de loin l'environnement supérieur pour le portage de programmes POSIX. Désormais sous LGPL, il permet de redistribuer des applications avec toutes sortes de licences, open ou closed source. Cygwin contient même l'émulation VT100 et termios, qui fonctionnent avec la console Microsoft! Une application POSIX qui configure le mode brut avec tcsetattret utilise des codes VT100 pour contrôler le curseur fonctionnera directement dans la cmd.exefenêtre. En ce qui concerne l'utilisateur final, il s'agit d'une application de console native effectuant des appels Win32 pour contrôler la console.

Toutefois:

  • En tant qu'outil de développement natif de Windows, Cygwin a certaines bizarreries, comme la gestion des chemins d'accès qui est étrangère à Windows, la dépendance à certains chemins codés en dur comme /bin/shet d'autres problèmes. Ces différences rendent les programmes Cygwin «non natifs». Si un programme prend un chemin en argument ou en entrée à partir d'une boîte de dialogue, les utilisateurs de Windows s'attendent à ce que ce chemin fonctionne de la même manière que dans les autres programmes Windows. Si cela ne fonctionne pas de cette façon, c'est un problème.

Plug: Peu de temps après l'annonce de LGPL, j'ai lancé le projet Cygnal (Cygwin Native Application Library) pour fournir un fork de la DLL Cygwin qui vise à résoudre ces problèmes. Les programmes peuvent être développés sous Cygwin, puis déployés avec la version Cygnal de cygwin1.dllsans recompilation. À mesure que cette bibliothèque s'améliore, elle éliminera progressivement le besoin de MinGW.

Lorsque Cygnal résout le problème de gestion des chemins, il sera possible de développer un seul exécutable qui fonctionne avec les chemins Windows lorsqu'il est livré en tant qu'application Windows avec Cygnal, et fonctionne parfaitement avec les chemins Cygwin lorsqu'il est installé dans votre /usr/binsous Cygwin. Sous Cygwin, l'exécutable fonctionnera de manière transparente avec un chemin comme /cygdrive/c/Users/bob. Dans le déploiement natif où il établit une liaison avec la version Cygnal de cygwin1.dll, ce chemin n'aura aucun sens, alors qu'il comprendra c:foo.txt.

Kaz
la source
2
Excellente réponse. Montrer ce qui se passe quand le même morceau de code est compilé, lié et exécuté dans chacun des 3 environnements est essentiel et clarifie les différences.
drlolly
@Kaz Comment se déroule ce développement? Cela semble intéressant, mais il semble mort depuis au moins un an. Pourquoi n'utilisez-vous pas GitHub pour que les gens puissent aider et participer?
not2qubit
2
@ not2qubit J'ai l'impression d'avoir un meilleur contrôle sur mes projets lorsqu'ils sont hébergés sur mon propre serveur que je contrôle moi-même. J'utilise git; le référentiel peut être extrait. Je peux accepter les demandes de tirage par e-mail (comme Linus Torvalds les a conçues). Je peux également donner un compte avec des privilèges de validation à quelqu'un qui devient un contributeur de niveau responsable. Cygnal fonctionne très bien; Je le regroupe régulièrement dans les versions Windows des nouvelles versions du langage TXR. Je vais rebaser Cygnal vers une nouvelle base de référence Cygwin au début de 2019.
Kaz
@ not2qubit Notez que les 17 questions de l'agenda Cygnal sont telles qu'adressées. Personne n'a suggéré de nouvelles exigences ou s'est plaint de la façon dont ces 17 demandes sont traitées. il n'y a donc pas de développement requis autre que le rebasage vers le nouveau Cygwin, ce qui n'est pas extrêmement urgent.
Kaz
27

Wikipedia dit :

MinGWdérivé de la version 1.3.3 de Cygwin. Bien que les deux Cygwin et MinGWpeut être utilisé pour le port UNIXlogiciel Windows, ils ont des approches différentes: Cygwinvise à fournir une solution complète POSIX layer qui fournit des émulations de plusieurs appels système et les bibliothèques qui existent sur Linux,UNIX et les BSDvariantes. Les POSIX layer courses sur le dessus Windows, sacrifiant les performances lorsque cela est nécessaire pour la compatibilité. Par conséquent, cette approche nécessite que les Windowsprogrammes écrits avec Cygwins'exécutent au-dessus d'une bibliothèque de compatibilité copyleftée qui doit être distribuée avec le programme, avec le programme source code. MinGWvise à fournir des fonctionnalités et des performances natives via direct Windows API calls. A la différence Cygwin,MinGWne nécessite pas de couche de compatibilité DLLet donc les programmes n'ont pas besoin d'être distribués avec source code.

Parce qu'il MinGWdépend Windows API calls, il ne peut pas fournir un plein POSIX API; il ne peut pas en compiler certains UNIX applicationsqui peuvent être compilés avec Cygwin. Plus précisément, cela s'applique aux applications qui nécessitent des POSIXfonctionnalités telles que fork(), mmap()ou à ioctl()celles qui s'attendent à être exécutées dans a POSIX environment. Les applications écrites à l' aide d' un cross-platform libraryqui lui - même a été porté MinGW, comme SDL, wxWidgets, Qtou GTK+, compileront généralement aussi facilement dans MinGWcomme ils le feraient dans Cygwin.

La combinaison de MinGWet MSYSfournit un petit environnement autonome qui peut être chargé sur un support amovible sans laisser d'entrées dans le registre ou de fichiers sur l'ordinateur. CygwinPortable offre une fonctionnalité similaire. En fournissant plus de fonctionnalités, Cygwin devient plus compliqué à installer et à entretenir.

Il est également possible de le faire cross-compile Windows applicationsavec MinGW-GCC under POSIX systems. Cela signifie que les développeurs n'ont pas besoin d'une installation Windows avec MSYSpour compiler des logiciels qui s'exécuteront Windowssans Cygwin.

PersianGulf
la source
2
Ce n'est certainement pas "plus compliqué à installer et à entretenir" ! Utilisez-le apt-cygcar c'est peut-être encore plus facile que d'utiliser apt sous WSL.
not2qubit
14

Ne négligez pas les AT & Tlogiciel U / Win d', qui est conçu pour vous aider à compiler les applications Unix sur Windows (dernière version - 06/08/2012; utilise la licence publique Eclipse, version 1.0).

Comme Cygwin, ils doivent fonctionner contre une bibliothèque; dans leur cas POSIX.DLL. Les gars d'AT & T sont d'excellents ingénieurs (le même groupe qui vous a apporté ksh et dot ) et leurs trucs valent la peine d'être vérifiés.

Norman Ramsey
la source
4
Wow, ce sont de mauvaises pages Web. J'ai finalement pu trouver un lien de téléchargement sur www2.research.att.com/sw/download , mais aucune documentation ou information en ligne sur le projet.
Fantius
1
Bien que les informations soient utiles, je pense que cela pourrait être la réponse à une question sur les alternatives pour MingW ou Cygwin plutôt que cette question.
Vivek
12

D'autres réponses ont déjà atteint la cible. Je veux juste ajouter une illustration pour une capture rapide.

entrez la description de l'image ici

smwikipedia
la source
11

Cygwin émule tout l'environnement POSIX, tandis que MinGW est un ensemble d'outils minimal pour la compilation uniquement (compile l'application Win native.) Donc, si vous voulez rendre votre projet multiplateforme, le choix entre les deux est évident, MinGW.

Bien que vous puissiez envisager d'utiliser VS sous Windows, GCC sous Linux / Unices. La plupart des projets open source le font (par exemple Firefox ou Python).

vartec
la source
"La plupart" semble être un mot fouine sans signification ici, surtout avec seulement 2 exemples et aucune statistique. De nombreux projets FOSS jettent un fichier de projet VS comme un geste symbolique, je pense que c'est plus précis. Mais si l'expérience passée est quelque chose, GCC ou Clang sont généralement plus sûrs car VS a tendance à être considérablement en retard à mesure que les normes linguistiques évoluent.
underscore_d
C'est une réponse de 2009. De nos jours, les choses semblent encore plus sombres pour GCC. Quant à «la plupart», si vous mesurez par impact, alors seuls Firefox et Chrome ont à eux seuls plus d'utilisateurs qu'autre chose.
vartec
2
Ce qui a changé depuis que j'ai répondu, c'est que c'est maintenant clangune solution multiplateforme viable.
vartec
9

Notez que le comportement de l'utilitaire peut réellement varier entre les deux.

Par exemple, Cygwin tar peut bifurquer - car fork () est pris en charge dans la DLL - là où la version mingw ne peut pas. C'est un problème lorsque vous essayez de compiler mysql à partir des sources.


la source
C'est pourquoi les environnements à part entière compatibles avec MinGW, par exemple MSYS2, offrent un Cygwin ou une autre couche entièrement compatible POSIX pour les écrous et boulons de bas niveau des chaînes d'outils nécessaires pendant la construction. Ensuite, la compilation et la liaison réelles sont laissées au compilateur MinGW entièrement natif. MSYS2 est vraiment bien.
underscore_d
9

Pour utiliser Cygwin dans une application commerciale / propriétaire / non open-source, vous devrez débourser des dizaines de milliers de dollars pour un « rachat de licence » de Red Hat; cela invalide les conditions de licence standard à un coût considérable. Google "coût de licence cygwin" et voir les premiers résultats.

Pour mingw, aucun coût de ce type n'est engagé et les licences (PD, BSD, MIT) sont extrêmement permissives. Au maximum, vous devrez peut- être fournir des détails de licence avec votre application, tels que la licence winpthreads requise lors de l'utilisation de mingw64-tdm.

EDIT grâce à Izzy Helianthus: La licence commerciale n'est plus disponible ni nécessaire car la bibliothèque d'API trouvée dans le sous-répertoire winsup de Cygwin est maintenant distribuée sous la LGPL, par opposition à la GPL complète.

Ingénieur
la source
2
Une mise à jour du site Web de Redhat (le lien depuis le «rachat de licence» - «Depuis le 1er mars 2016, Red Hat ne vend plus la licence de rachat commerciale pour Cygwin. La licence commerciale n'est plus nécessaire car Cygwin est maintenant distribué sous GNU Lesser GPL (LGPL). '> Depuis le site Web de Cygwin. La bibliothèque d'API Cygwin ™ qui se trouve dans le sous-répertoire winsup du code source est couverte par la licence GNU Lesser General Public License (LGPL) version 3 ou ultérieure. Pour plus de détails sur les exigences de LGPLv3, veuillez lire la licence publique générale limitée GNU (LGPL)
Izzy Helianthus
6

Cygwin est conçu pour fournir un environnement POSIX plus ou moins complet pour Windows, y compris un ensemble complet d'outils conçus pour fournir une plate-forme de type Linux à part entière. En comparaison, MinGW et MSYS fournissent une couche légère et minimaliste de type POSIX, avec seulement les outils les plus essentiels comme gccetbash disponibles. En raison de l'approche plus minimaliste de MinGW, elle ne fournit pas le degré de couverture API POSIX qu'offre Cygwin et ne peut donc pas créer certains programmes qui pourraient autrement être compilés sur Cygwin.

En termes de code généré par les deux, la chaîne d'outils Cygwin repose sur une liaison dynamique vers une grande bibliothèque d'exécution cygwin1.dll, tandis que la chaîne d'outils MinGW compile du code vers des fichiers binaires qui se lient dynamiquement à la bibliothèque C native de Windows msvcrt.dllainsi que statiquement à des parties deglibc . Les exécutables Cygwin sont donc plus compacts mais nécessitent une DLL redistribuable distincte, tandis que les binaires MinGW peuvent être livrés autonomes mais ont tendance à être plus volumineux.

Le fait que les programmes basés sur Cygwin nécessitent une DLL distincte pour s'exécuter entraîne également des restrictions de licence. La bibliothèque d'exécution Cygwin est sous licence GPLv3 avec une exception de liaison pour les applications avec des licences conformes OSI, donc les développeurs souhaitant créer une application de source fermée autour de Cygwin doivent acquérir une licence commerciale de Red Hat. D'un autre côté, le code MinGW peut être utilisé à la fois dans des applications open source et fermées, étant donné que les en-têtes et les bibliothèques sont autorisés sous licence.

bwDraco
la source
3

Cygwin est un environnement de type Unix et une interface de ligne de commande pour Microsoft Windows.

Mingw est un port logiciel natif de la collection de compilateurs GNU (GCC) pour Microsoft Windows, ainsi qu'un ensemble de bibliothèques d'importation et de fichiers d'en-tête librement distribuables pour l'API Windows. MinGW permet aux développeurs de créer des applications Microsoft Windows natives.

Vous pouvez exécuter des fichiers binaires générés mingwsans l' cygwinenvironnement, à condition que toutes les bibliothèques (DLL) nécessaires soient présentes.

gimel
la source
1

Cygwinutilise une couche de compatibilité, tandis qu'il MinGWest natif. C'est l'une des principales différences.

user3362761
la source