Quelle est la différence entre Cygwin et MinGW?
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 serai capable d'exécuter le binaire sur un système sans Cygwin/MinGW ?
15 réponses
Pour simplifier, c'est comme ceci:
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 *nix vers Windows, en émulant de nombreux petits détails fournis par les systèmes D'exploitation basés sur Unix et documentés par les normes POSIX . Si votre application suppose qu'elle peut utiliser des fonctionnalités Unix telles que des tuyaux, un accès aux fichiers et répertoires de style Unix, etc., vous pouvez la compiler dans Cygwin et Cygwin agira lui-même comme une couche de compatibilité autour de votre application, de sorte que beaucoup de ces paradigmes spécifiques à Unix peuvent continuer à être utilisés
Si vous voulez compiler quelque chose pour Cygwin et distribuer cette application résultante, vous devez également distribuer L'environnement D'exécution Cygwin (fourni par cygwin1.dll
) avec lui, et cela a des implications pour les types de licence logicielle que vous pouvez utiliser .
Sur MinGW
MinGW est un port Windows des outils du compilateur GNU, tels que GCC, Make, Bash,etc. Il ne tente pas d'émuler ou de fournir une compatibilité complète avec Unix, mais il fournit l'environnement minimum nécessaire pour utiliser GCC (le compilateur GNU) et un petit nombre de autres outils sous Windows . Il n'a pas de couche D'émulation Unix comme Cygwin, mais par conséquent, votre application doit être spécifiquement programmée pour pouvoir fonctionner sous Windows, ce qui peut signifier une modification importante si elle a été créée pour ê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 GCC de MinGW compilera vers une cible Windows x86 native, y compris .exe et .fichiers dll, bien que vous puissiez aussi cross-compiler avec les bons paramètres. MinGW est une alternative open-source au compilateur Microsoft Visual C++ et à ses outils de liaison/création associés.
Il existe des frameworks multiplateformes considérablement sophistiqués qui facilitent le portage d'applications vers différents systèmes d'exploitation - par exemple le framework Qt est un framework populaire pour les applications multiplateformes. Si vous utilisez un tel cadre, dès le début, vous pouvez non seulement réduire vos maux de tête quand vient le temps de porter vers une autre plate - forme, mais vous pouvez utiliser les mêmes widgets graphiques - fenêtres, menus et contrôles-sur toutes les plates-formes si vous écrivez une application GUI.
Cygwin est une tentative de créer un environnement UNIX/POSIX complet sous Windows. Pour ce faire, il utilise diverses DLL. Bien que ces DLL soient couvertes par la GPLv3+, leur licence contient une exception qui ne force pas un travail dérivé à être couvert par la GPLv3+. MinGW est une suite de compilateur C / C++ qui vous permet de créer des exécutables Windows sans dépendance sur de telles DLL - vous avez seulement besoin des runtimes MSVC normaux, qui font partie de toute installation normale de Microsoft Windows.
Vous peut également obtenir un petit environnement de type UNIX/POSIX, compilé avec MinGW appelé MSYS . Il n'a nulle part près de toutes les fonctionnalités de Cygwin, mais est idéal pour les programmeurs souhaitant utiliser MinGW.
Pour ajouter aux autres réponses, Cygwin est livré avec les bibliothèques et les en-têtes MinGW et vous pouvez compiler sans lien avec cygwin1.dll en utilisant l'indicateur-MNO-cygwin avec gcc. Je préfère grandement cela à l'utilisation de MinGW et MSYS simples.
Wikipedia fait une comparaison ici.
- 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 Linux regarder et se sentir.
MinGW ("GNU minimaliste pour Windows") est une collection de fichiers d'en-tête spécifiques à Windows disponibles et librement distribuables et de bibliothèques d'importation combinées avec des ensembles D'outils GNU qui permettent de produire des programmes Windows natifs qui ne reposent sur aucune DLL d'exécution C tierce
Cygwin utilise une DLL, cygwin.dll, (ou peut-être un ensemble de DLL) pour fournir un runtime de type POSIX sur Windows.
MinGW compile vers 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 n'a pas besoin d'exécution spéciale.
Lisez ces questions répondues pour comprendre la différence entre Cygwin et MinGW.
Question # 1: je veux créer une application que j'écris du code source Une fois, le compiler une fois et l'exécuter 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 du code source Une fois mais il n'y a pas 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++. Utiliser les fichiers d'en-tête seulement. Utilisez un compilateur approprié pour tout plate-forme (par exemple Visual Studio pour Windows, GCC Pour Linux et XCode pour Mac). Notez que vous ne devez pas utiliser fonctionnalités de programmation avancées pour compilez votre code source en tout plates-formes avec succès. Si vous utilisez aucune classe standard C ou c++ ou fonctions, votre code source ne fonctionne pas compiler dans d'autres plates-formes.
Question # 3: en réponse à la question # 2, Il est difficile d'utiliser un compilateur différent pour chaque plate-forme, y a-t-il un compilateur multi-plateforme?
Réponse # 3: Oui, utilisez le compilateur GCC. Il est une plate-forme de compilateur. De compilez votre code source dans Windows utilisez MinGW qui fournit le compilateur GCC pour Windows et compile votre source code au programme Windows natif. Ne pas utiliser toutes les fonctionnalités de programmation avancées (comme L'API Windows) pour compiler votre code source sur toutes les plateformes réussi. Si vous utilisez L'API Windows fonctions, votre code source ne fonctionne pas compiler dans 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 devriez utiliser POSIX (Interface Du Système D'Exploitation Portable [pour UNIX]) standard. Il fournit beaucoup d' fonctions de programmation avancées et outils. De nombreux systèmes d'exploitation entièrement ou partiellement compatible POSIX (comme Mac OS X, Solaris, BSD / OS et ...). Quelque systèmes d'exploitation alors que pas officiellement certifié compatible POSIX, conforme en grande partie (comme Linux, FreeBSD, OpenSolaris et ...). Cygwin fournit un développement largement compatible POSIX et environnement d'exécution pour Microsoft Windows.
Ainsi:
Pour utiliser l'avantage de GCC cross platform compilateur dans Windows, utilisez MinGW.
Pour utiliser les fonctionnalités et outils de programmation avancés standard POSIX dans Windows, utilisez Cygwin.
MinGW
fourche à partir de la version 1.3.3 deCygwin
. Bien que les deuxCygwin
etMinGW
peut être utilisé pour porter le logicielUNIX
àWindows
, ils avoir des approches différentes:Cygwin
vise à fournir unPOSIX layer
cela fournit des émulations de plusieurs appels système et bibliothèques qui existent surLinux
,UNIX
, et laBSD
variantes. LePOSIX layer
fonctionne au-dessus deWindows
, sacrifiant les performances où nécessaire pour la compatibilité. En conséquence, cette approche nécessiteWindows
programmes écrits avecCygwin
à exécuter au-dessus d'un copyleft bibliothèque de compatibilité qui doit être distribuée avec le programme, ainsi que avecsource code
du programme.MinGW
vise à fournir natif fonctionnalité et performance via directWindows API calls
. ContrairementCygwin
,MinGW
ne nécessite pas de couche de compatibilitéDLL
et ainsi, les programmes n'ont pas besoin d'être distribué avecsource code
.Parce que
MinGW
dépend deWindows API calls
, Il ne peut pas fournir unPOSIX API
complet; il est incapable de compilez certainsUNIX applications
qui peuvent être compilés avecCygwin
. Plus précisément, ce s'applique aux applications qui nécessitent des fonctionnalitésPOSIX
telles quefork()
,mmap()
ouioctl()
et ceux qui s'attendent à être exécuté dans unPOSIX environment
. Applications écrites à l'aide d'uncross-platform library
qui a lui-même été porté surMinGW
, tel queSDL
,wxWidgets
,Qt
, ouGTK+
, généralement compiler facilement dansMinGW
comme ils le feraient dansCygwin
.La combinaison de
MinGW
etMSYS
fournit une petite autonome environnement qui peut être chargé sur un support amovible sans quitter les entrées dans le registre ou les fichiers sur l'ordinateur.Cygwin
Portable fournit une fonctionnalité similaire. En fournissant plus de fonctionnalités,Cygwin
devient plus compliqué à installer et à entretenir., Il est également possible de
cross-compile Windows applications
avecMinGW-GCC under POSIX systems
. Cela signifie que les développeurs ne le font pas besoin D'une installation Windows avecMSYS
pour compiler un logiciel qui exécuter surWindows
, sansCygwin
.
Du point de vue de portage d'un programme C, une bonne façon de comprendre c'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
à _stat
, nous pouvons compiler ce programme avec Microsoft Visual C. On peut aussi 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
est un suffixe de version. Pour expédier ce programme, nous devrons inclure cette DLL. Cette DLL fournit _stat
, system
et printf
.
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 qui est interdite à l'utilisation de l'application. Cette bibliothèque est essentiellement une fourchette 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 fonction
stat
renverra des informations très limitées - pas d'autorisations utiles ou numéro d'inœud, par exemple. - le chemin
c:file.txt
est résolu en fonction du répertoire de travail actuel associé au lecteurc:
. -
system
utilisecmd.exe /c
pour exécuter la commande externe.
Nous pouvons aussi compiler le programme sous Cygwin. De même que 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
(GCC run-time support). Depuis Cygwin est maintenant sous la LGPL, nous peut emballer avec notre programme, même s'il n'est pas un logiciel libre compatible GPL, et expédier le programme.
Sous Cygwin, les fonctions de la bibliothèque se comporteront différemment:
- la fonction
stat
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, puisquec:
n'est pas suivi d'une barre oblique. Le côlon est considéré comme une partie du nom et en quelque sorte mutilé en elle. Il est 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 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 programmesh.exe
soit co-localisé avec votre exécutable.
Cygwin et MinGW vous permettent D'utiliser les fonctions Win32. Si vous voulez l'appeler MessageBox
ou CreateProcess
, vous pouvez le faire. Vous peut également facilement construire un programme qui ne nécessite 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 (des éléments trouvés dans msvcrt.dll
ou les temps d'exécution msvcrtnn.dll
redistribuables). Un exemple de ceci est la famille spawn*
de fonctions comme spawnvp
. Ce sont une bonne idée à utiliser à la place de fork
et exec
sur Cygwin car ils cartographient 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 pour des raisons de nécessité de l'accompagnement des bibliothèques. Les implémentations de langage de programmation sur Windows sont censées 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 DLL tierce est en fait un inconvénient; cela dépend d'un fork interne Windows non documenté de L'exécution Visual C. MinGW le fait parce que l'exception de bibliothèque système GPL s'applique à
msvcrt.dll
, ce qui signifie que les programmes GPL-ed peuvent être compilés et redistribués avec MinGW.En raison de son support beaucoup plus large et plus profond pour POSIX par rapport à
msvcrt.dll
, Cygwin est de loin L'environnement supérieur pour le portage des programmes POSIX. Comme il est maintenant sous la LGPL, il permet des applications avec tous les sortes de licences, source ouverte ou fermée, à redistribuer. Cygwin contient même l'émulation VT100 ettermios
, qui fonctionnent avec la console Microsoft! Une application POSIX qui configure le mode raw avectcsetattr
et utilise des codes VT100 pour contrôler le curseur fonctionnera directement dans la fenêtrecmd.exe
. En ce qui concerne l'utilisateur final, il s'agit d'une application console native faisant des appels Win32 pour contrôler la console.
Cependant:
- en tant qu'outil de développement Windows natif, Cygwin a quelques bizarreries, comme la gestion des chemins qui est étrangère à Windows, la dépendance à certains chemins codés en dur comme
/bin/sh
et d'autres problèmes. Ces différences sont ce qui rend les programmes Cygwin "non natifs". Si un programme prend un chemin comme argument ou entrée 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 ça ne marche pas comme ça, c'est un problème.
Plug: peu de temps après L'annonce de LGPL, j'ai commencé le Cygnal (Cygwin Native Application Library) projet 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.dll
sans recompiler. Au fur et à mesure que cette bibliothèque s'améliorera, 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 que Windows application avec Cygnal, et fonctionne de manière transparente avec les chemins Cygwin lorsqu'il est installé dans votre /usr/bin
sous 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 est lié à la version Cygnal de cygwin1.dll
, ce chemin n'aura aucun sens, alors qu'il comprendra c:foo.txt
.
Ne négligez pas AT & T's u / Win logiciel, qui est conçu pour vous aider à compiler des applications Unix sur windows (dernière version - 2012-08-06; utilise Eclipse Public License, Version 1.0).
Comme Cygwin, ils doivent courir contre une bibliothèque; dans leur cas POSIX.DLL
. Les gars D'AT&T sont des ingénieurs formidables (même groupe qui vous a amené ksh et dot ) et leurs trucs valent le détour.
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 faire votre projet multi-plateforme le choix entre les deux est évident, MinGW.
Bien que vous pourriez envisager D'utiliser VS sur Windows, GCC sur Linux / Unices. La plupart des projets open source le font (par exemple Firefox ou Python).
Pour utiliser Cygwin dans une application commerciale / propriétaire / Non open-source, vous devrez débourser des dizaines de milliers de dollars pour un "license buyout" 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 n'est encouru, et les licences (PD, BSD, MIT) sont extrêmement permissives. Tout au plus vous pouvez être censé fournir des détails de licence avec votre application, telle que la licence winpthreads requise lors de l'utilisation de mingw64-tdm.
EDIT grâce à Izzy Helianthus: la licence commerciale n'est plus disponible ou nécessaire car la bibliothèque API trouvée dans le sous-répertoire winsup de Cygwin est maintenant distribuée sous LGPL, par opposition à la GPL complète.
Notez que le comportement de l'utilitaire peut réellement varier entre les deux.
Par exemple, Cygwin tar peut fork - parce que fork() est pris en charge dans la DLL - où la version mingw ne peut pas. C'est un problème lorsque vous essayez de compiler mysql à partir de la source.
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 Linux à part entière. En comparaison, MinGW et MSYS fournissent une couche légère et minimaliste semblable à POSIX, avec seulement les outils les plus essentiels comme gcc
et bash
disponibles. En raison de L'approche plus minimaliste de MinGW, il ne fournit pas le degré de couverture de L'API POSIX que Cygwin offre, et ne peut donc pas construire certains programmes qui peut autrement être compilé sur Cygwin.
En termes de code généré par les deux, la chaîne D'outils Cygwin repose sur un lien dynamique vers une grande bibliothèque d'exécution, cygwin1.dll
, tandis que la chaîne D'outils MinGW compile du code dans des binaires qui se lient dynamiquement à la bibliothèque C native de Windows msvcrt.dll
ainsi que statiquement à des parties de glibc
. Les exécutables Cygwin sont donc plus compacts mais nécessitent une DLL redistribuable séparée, tandis que les binaires MinGW peuvent être expédiés de manière autonome mais ont tendance à l'être plus grandes.
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 compatibles OSI, de sorte que les développeurs souhaitant créer une application source fermée autour de Cygwin doivent 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 open-source, comme les en-têtes et les bibliothèques sont permissivité sous licence.
Cygwin
utilise une couche de compatibilité, tandis que MinGW
est originaire. C'est l'une des principales différences.