web-dev-qa-db-fra.com

Quelle est la différence entre Cygwin et MinGW?

Je souhaite que mon projet C++ soit multi-plateforme et 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?

605
Łukasz Lew

Par simplification, 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

Cygwin a pour but de faciliter le portage d'applications Windows sous Unix, en émulant de nombreux détails fournis par les systèmes d'exploitation Unix et documentés par les normes POSIX . Votre application peut utiliser des fonctionnalités Unix telles que des pipes, un accès de type et de répertoire de style Unix, etc., et elle peut être compilée avec Cygwin qui agira comme un calque de compatibilité autour de votre environnement. application, de sorte que bon nombre de ces paradigmes spécifiques à Unix puissent continuer à être utilisés.

Lorsque vous distribuez votre logiciel, le destinataire doit l'exécuter avec l'environnement d'exécution Cygwin (fourni par le fichier cygwin1.dll). Vous pouvez le distribuer avec votre logiciel, mais votre logiciel devra être conforme à sa licence open source. Il se peut même que même le simple fait de lier votre logiciel à celui-ci, mais de distribuer la dll séparément, vous oblige encore à respecter la licence open source.

À propos de MinGW

MinGW se veut simplement un port Windows des GNU outils de compilation, tels que GCC, Make, Bash, etc. Il n'essaie pas d'émuler ni de fournir une compatibilité complète avec Unix, mais fournit l'environnement minimum nécessaire pour utiliser GCC (le compilateur GNU) et un petit nombre d'autres outils sur Les fenêtres. Il n’a pas de couche d’émulation Unix comme Cygwin, mais votre application doit donc être spécifiquement programmée pour pouvoir fonctionner sous Windows, ce qui peut impliquer une modification importante si elle a été créée pour pouvoir être exécutée dans un environnement Unix standard. utilise des fonctionnalités spécifiques à Unix telles que celles mentionnées précédemment. Par défaut, le code compilé dans GCC de MinGW sera compilé en 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 le GNU suite d'outils de compilateur.

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

MinGW inclut des bibliothèques standard de base permettant d’interagir avec le système d’exploitation Windows. Toutefois, comme pour les bibliothèques standard standard incluses dans la collection de compilateurs GNU, elles n’imposent aucune restriction de licence pour les logiciels que vous avez créés.

Pour des applications logicielles non triviales, les rendre multiplates-formes peut s'avérer un défi considérable si vous n'utilisez pas un cadre multiplate-forme complet. A l'époque, j’écrivais ceci Qt framework était l’un des plus populaires, permettant de créer des applications graphiques fonctionnant sur des systèmes d’exploitation tels que Windows, mais il existe aussi d’autres options. Si vous utilisez un tel cadre dès le début, vous pouvez non seulement réduire vos problèmes de port sur une autre plate-forme, mais vous pouvez également utiliser les mêmes widgets graphiques - fenêtres, menus et contrôles - sur toutes les plates-formes si vous écrivez un fichier. App GUI, et les faire apparaître natif à l'utilisateur.

575
thomasrutter

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

Vous pouvez également obtenir un petit environnement de type UNIX/POSIX, compilé avec MinGW appelé MSYS . Cygwin ne possède pas toutes les fonctionnalités de Cygwin, mais il est idéal pour les programmeurs souhaitant utiliser MinGW.

306
anon

Pour compléter les autres réponses, Cygwin est fourni avec les bibliothèques et les en-têtes MinGW et vous pouvez compiler sans créer de lien vers cygwin1.dll à l’aide de -mno-cygwin avec gcc. Je préfère grandement cela à l’utilisation de MinGW et MSYS.

137
TrayMan

Wikipedia fait une comparaison ici .

De Cygwin site web :

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

De Mingw's site web :

MinGW ("Minimalistic GNU pour Windows") est une collection de fichiers d’en-tête spécifiques à Windows librement disponibles et librement distribuables, combinés à GNU outils permettant de produire des programmes Windows natifs ne comptez pas sur les DLL d'exécution C tierces

60
dirkgently

Cygwin utilise une DLL, cygwin.dll (ou peut-être un ensemble de DLL) pour fournir une exécution de type POSIX sous Windows.

MinGW se compile en une application Win32 native.

Si vous construisez quelque chose avec Cygwin, tout système sur lequel vous l'installez aura également besoin de la (des) DLL (s) Cygwin. Une application MinGW ne nécessite aucune exécution spéciale.

45
Michael Burr

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


Question n ° 1: Je veux créer une application pour laquelle je rédige le code source une fois, la compiler une fois et l’exécuter sur n’importe quelle plate-forme (Windows, Linux et Mac OS X, par exemple).

Réponse n ° 1: Écrivez votre code source en Java. Compilez le code source une fois et exécutez-le n’importe où.


Question n ° 2: Je veux créer une application pour laquelle j'écris le code source une fois, mais je n'ai pas de problème à le compiler séparément pour toutes les plates-formes (par exemple Windows, Linux et Mac OS X…).

Réponse n ° 2: Écrivez votre code source en C ou C++. Utilisez uniquement les fichiers d'en-tête standard. Utilisez un compilateur adapté à chaque plate-forme (Visual Studio pour Windows, GCC pour Linux et XCode pour Mac, par exemple). Notez que vous ne devez utiliser aucune fonctionnalité de programmation avancée pour compiler votre code source sur toutes les plateformes. 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 n ° 3: En réponse à la question n ° 2, il est difficile d'utiliser un compilateur différent pour chaque plate-forme. Existe-t-il un compilateur multiplateforme?

Réponse n ° 3: Oui, utilisez le compilateur GCC. C'est un compilateur multiplateforme. Pour compiler votre code source sous Windows, utilisez MinGW qui fournit le compilateur GCC pour Windows et compile votre code source en programme Windows natif. N'utilisez aucune fonctionnalité de programmation avancée (telle que l'API Windows) pour compiler votre code source sur toutes les plateformes. Si vous utilisez les fonctions de l'API Windows, votre code source ne se compile pas sur d'autres plates-formes.


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

Réponse n ° 4: Vous devez utiliser le standard POSIX (interface portable pour le système d'exploitation [pour UNIX]). Il fournit de nombreuses fonctionnalités et outils de programmation avancés. De nombreux systèmes d'exploitation totalement ou partiellement compatibles POSIX (tels que Mac OS X, Solaris, BSD/OS et ...). Certains systèmes d'exploitation, même s'ils ne sont pas officiellement certifiés compatibles POSIX, sont largement conformes (comme Linux, FreeBSD, OpenSolaris et ...). Cygwin fournit un environnement d'exécution et de développement largement compatible avec POSIX pour Microsoft Windows.


Ainsi:

Pour utiliser les avantages du compilateur multiplateforme GCC sous Windows, utilisez MinGW.

Pour utiliser les avantages des fonctionnalités et outils de programmation avancés standard POSIX dans Windows, utilisez Cygwin.

41
Amir Saniyan

d'après Wikipedia :

MinGW est dérivé de la version 1.3.3 de Cygwin. Bien que Cygwin et MinGW puissent être utilisés pour porter le logiciel UNIX à Windows, leurs approches sont différentes: Cygwin vise à fournir un POSIX layer complet fournissant des émulations de plusieurs appels système et bibliothèques existant sur Linux, UNIX et les variantes BSD. POSIX layer s'exécute sur Windows, en sacrifiant les performances si nécessaire pour des raisons de compatibilité. En conséquence, cette approche nécessite que les programmes Windows écrits avec Cygwin s'exécutent par-dessus une bibliothèque de compatibilité copyleftée devant être distribuée avec le programme, avec le source code du programme. MinGW vise à fournir des fonctionnalités et des performances natives via Windows API calls direct. Contrairement à Cygwin, MinGW ne nécessite pas de couche de compatibilité DLL et les programmes ne doivent donc pas être distribués avec source code.

Étant donné que MinGW dépend de Windows API calls, il ne peut pas fournir un POSIX API complet; il est impossible de compiler des UNIX applications pouvant être compilés avec Cygwin. En particulier, cela s'applique aux applications nécessitant une fonctionnalité POSIX comme fork(), mmap() ou ioctl() et à celles qui s'attendent à être exécutées dans un POSIX environment. Les applications écrites à l'aide d'un cross-platform library qui a lui-même été porté sur MinGW, tel que SDL, wxWidgets, Qt ou GTK+, seront généralement compilées aussi facilement dans MinGW que dans Cygwin.

La combinaison de MinGW et MSYS fournit un petit environnement autonome pouvant être chargé sur un support amovible sans laisser d'entrées dans la base de registre ou de fichiers sur l'ordinateur. Cygwin Portable offre une fonctionnalité similaire. En fournissant davantage de fonctionnalités, Cygwin devient plus compliqué à installer et à gérer.

Il est également possible de cross-compile Windows applications avec MinGW-GCC under POSIX systems. Cela signifie que les développeurs n'ont pas besoin d'une installation Windows avec MSYS pour compiler un logiciel qui s'exécutera sur Windows sans Cygwin.

26
PersianGulf

Du point de vue du portage d’un programme C, un bon moyen de comprendre ceci 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 changeons stat en _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ù nn correspond à un suffixe de version. Pour expédier ce programme, nous devrons inclure cette DLL. Cette DLL fournit _stat, system et 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, non documentée, faisant partie de Windows et interdite à l’utilisation des applications. Cette bibliothèque est essentiellement une branche de la bibliothèque d’exécution redistribuable de MS Visual C pour une utilisation par Windows elle-même.

Sous ces deux aspects, le programme aura des comportements similaires:

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

Nous pouvons également compiler le programme sous Cygwin. De la même manière que le programme d’exécution redistribuable utilisé 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 (support d’exécution GCC). Puisque Cygwin est maintenant sous la licence LGPL, nous pouvons intégrer notre programme, même s’il ne s’agit pas d’un logiciel libre compatible avec la GPL, et expédier le programme.

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

  • la fonction stat possède une riche fonctionnalité, 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 à une lettre de lecteur, puisque c: n'est pas suivi d'une barre oblique. Le côlon est considéré comme faisant partie du nom et est en quelque sorte mutilé. Il n'y a pas de concept de chemin relatif par rapport à un volume ou à un lecteur dans Cygwin, ni de concept de "lecteur actuellement connecté", ni de répertoire de travail actuel par lecteur.
  • la fonction system essaie d'utiliser l'interpréteur /bin/sh -c. Cygwin résoudra le chemin / en fonction de l'emplacement de votre exécutable et s'attend à ce qu'un programme sh.exe soit co-localisé avec votre exécutable.

Cygwin et MinGW vous permettent tous deux d'utiliser les fonctions Win32. Si vous voulez appeler MessageBox ou CreateProcess, vous pouvez le faire. Vous pouvez également créer facilement un programme ne nécessitant pas de fenêtre de console, en utilisant gcc -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 (éléments trouvés dans msvcrt.dll ou dans les exécutions msvcrtnn.dll redistribuables). Un exemple de ceci est la famille de fonctions spawn* comme spawnvp. Celles-ci sont une bonne idée à utiliser à la place de fork et exec sur Cygwin, car elles correspondent mieux au modèle de création de processus Windows qui n'a pas de concept de fork.

Ainsi:

  • 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 de langage de programmation sous Windows doivent fournir leurs propres implémentations d'exécution, même en langage C. Il n'y a pas de "libc" sur Windows pour un usage public.

  • Le fait que MinGW ne nécessite aucune tierce partie DLL est en réalité un inconvénient; cela dépend d'un fork non documenté, interne à Windows, de l'exécution Visual C. MinGW fait cela parce que 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.

  • Grâce à sa prise en charge beaucoup plus large et plus approfondie de POSIX par rapport à msvcrt.dll, Cygwin est de loin l’environnement supérieur pour le portage de programmes POSIX. Comme il est maintenant sous la licence LGPL, il permet de redistribuer les applications avec toutes sortes de licences, source ouverte ou source fermée. Cygwin contient même l'émulation VT100 et termios, qui fonctionnent avec la console Microsoft! Une application POSIX qui définit le mode brut avec tcsetattr et utilise des codes VT100 pour contrôler le curseur fonctionnera directement dans la fenêtre cmd.exe. En ce qui concerne l'utilisateur final, il s'agit d'une application de console native qui appelle Win32 pour contrôler la console.

Pourtant:

  • En tant qu’outil de développement Windows natif, Cygwin présente certaines particularités, telles que la gestion des chemins étrangers à Windows, la dépendance de certains chemins codés en dur comme /bin/sh et d’autres problèmes. Ce sont ces différences qui rendent les programmes Cygwin "non natifs". Si un programme utilise un chemin d'accès comme argument ou comme entrée d'une boîte de dialogue, les utilisateurs Windows s'attendent à ce que ce chemin d'accès fonctionne de la même manière que dans les autres programmes Windows. Si cela ne fonctionne pas comme ça, c'est un problème.

Plug: Peu de temps après l’annonce de la LGPL, j’ai lancé le projet Cygnal (Cygwin Native Application Library) pour fournir un fork du Cygwin DLL 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.dll sans recompilation. À mesure que cette bibliothèque s’améliorera, elle éliminera progressivement le besoin de MinGW.

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

25
Kaz

Ne négligez pas le logiciel /Win d'AT & T, conçu pour vous aider à compiler des applications Unix sous Windows (dernière version - 2012-08-06; utilise la licence publique Eclipse, version 1.0).

Comme Cygwin, ils doivent s’exécuter contre une bibliothèque; dans leur cas, POSIX.DLL. Les gars d’AT & T sont d’ingénieurs géniaux (le même groupe qui vous a apporté ksh et point ) et leur travail vaut la peine d’être examiné.

14
Norman Ramsey

Cygwin émule l’ensemble de l’environnement POSIX, alors que MinGW est un ensemble minimal d’outils pour la compilation (compile une application Win native). Par conséquent, si vous souhaitez que votre projet soit multiplate-forme, le choix entre les deux est évident, MinGW.

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

10
vartec

Pour utiliser Cygwin dans une application commerciale/propriétaire/non-open-source, vous devez débourser des dizaines de milliers de dollars pour un achat de " licence " de Red Hat. cela invalide les conditions générales de licence à un coût considérable. Google "coût de la 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. Tout au plus vous pouvez être censé fournir les détails de la licence avec votre application, tels que la licence winpthreads requise pour 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 de configuration de Cygwin est maintenant distribué sous la LGPL, par opposition à la GPL complète.

9
Engineer

Notez que le comportement des utilitaires peut réellement varier entre les deux.

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

8
user82238

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 uniquement les outils essentiels tels que gcc et bash disponibles. Du fait de son approche plus minimaliste, MinGW ne fournit pas le degré de couverture offert par les API POSIX offertes par Cygwin et ne peut donc pas générer certains programmes qui pourraient autrement être compilés sur Cygwin.

En ce qui concerne le code généré par les deux groupes, la chaîne d’outils Cygwin repose sur la liaison dynamique à une grande bibliothèque d’exécution, cygwin1.dll, tandis que la chaîne d’outils MinGW compile le code en fichiers binaires liés de manière dynamique à la bibliothèque C native de Windows msvcrt.dll, ainsi que de manière statique glibc. Les exécutables Cygwin sont donc plus compacts, mais nécessitent une DLL redistribuable distincte, tandis que les fichiers binaires MinGW peuvent être livrés en mode autonome, mais ont tendance à être plus volumineux.

Le fait que les programmes basés sur Cygwin nécessitent l'exécution de DLL distincte 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 compatibles OSI. Les développeurs souhaitant créer une application à source fermée autour de Cygwin doivent donc acquérir une licence commerciale auprès de Red Hat. D'autre part, le code MinGW peut être utilisé à la fois dans les applications open source et les applications open source, car les en-têtes et les bibliothèques sont concédés sous licence.

6
bwDraco

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

enter image description here

5
smwikipedia

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

Mingw est un port logiciel natif de la GNU Compiler Collection (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 natives Microsoft Windows.

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

3
gimel

Cygwin utilise un calque de compatibilité, tandis que MinGW est natif. C'est l'une des principales différences.

1
user3362761