Je veux faire de mon projet C ++ une plate-forme 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 binary sur un système sans Cygwin / MinGW?
Pour simplifier, c’est comme ça:
Comstackz quelque chose dans Cygwin et vous le comstackz pour Cygwin .
Comstackz quelque chose dans MinGW et vous le comstackz pour Windows .
A 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 les fonctionnalités Unix telles que les pipes, l’access aux fichiers et aux répertoires de type Unix, etc., vous pouvez les comstackr dans Cygwin et Cygwin lui-même agira comme une couche de compatibilité autour de votre application. Ces paradigmes spécifiques à Unix peuvent continuer à être utilisés avec peu ou pas de modifications à votre application.
Si vous voulez comstackr quelque chose pour Cygwin et dissortingbuer cette application résultante, vous devez également dissortingbuer l’environnement d’exécution Cygwin (fourni par cygwin1.dll
) avec cela, ce qui a des implications sur les types de licences logicielles que vous pouvez utiliser .
À propos de MinGW
MinGW est un port Windows des outils de compilation GNU, tels que GCC, Make, Bash, etc. Il n’essaie pas d’émuler ou de fournir une compatibilité complète avec Unix, mais fournit plutôt 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 votre application doit donc être spécifiquement programmée pour pouvoir être exécutée sous Windows, ce qui peut signifier une modification importante si elle était conçue pour ê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 parameters. MinGW est une alternative open-source au compilateur Microsoft Visual C ++ et à ses outils de liaison / création associés.
Des frameworks multi-plateformes sophistiqués existent, qui facilitent le portage des applications sur différents systèmes d’exploitation – par exemple, le framework Qt est une infrastructure populaire pour les applications multiplates-formes. Si vous utilisez un tel framework dès le départ, vous pouvez non seulement réduire vos maux de tête lors du portage sur une autre plate-forme, mais aussi utiliser les mêmes widgets graphiques – fenêtres, menus et contrôles – sur toutes les plates-formes. Application graphique
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 GPLv3 +, leur licence contient une exception qui ne force pas le travail dérivé à GPLv3 +. MinGW est une suite de compilateurs C / C ++ qui vous permet de créer des fichiers exécutables Windows sans dépendance de ces 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 similaire à UNIX / POSIX, compilé avec MinGW appelé MSYS . Il ne contient pratiquement aucune des fonctionnalités de Cygwin, mais est idéal pour les programmeurs souhaitant utiliser MinGW.
Pour append aux autres réponses, Cygwin est fourni avec les bibliothèques et les en-têtes MinGW et vous pouvez comstackr sans lier le fichier cygwin1.dll en utilisant l’option -mno-cygwin avec gcc. Je préfère grandement cela à l’utilisation de MinGW simple et MSYS.
Wikipedia fait une comparaison ici .
Du 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 API Linux fournissant des fonctionnalités substantielles de l’API Linux.
- Une collection d’outils fournissant l’apparence Linux.
Du site Web de Mingw:
MinGW (“Minimalistic GNU for Windows”) est un ensemble de fichiers d’en-tête spécifiques à Windows et de bibliothèques d’importation librement disponibles et librement dissortingbuables, associés à des jeux d’outils GNU permettant de produire des programmes Windows natifs ne faisant pas appel à des DLL d’exécution C tierces.
Cygwin utilise une DLL, cygwin.dll (ou peut-être un ensemble de DLL) pour fournir un environnement d’exécution de type POSIX sous Windows.
MinGW comstack en une application Win32 native.
Si vous construisez quelque chose avec Cygwin, tout système sur lequel vous l’installerez aura également besoin de la ou des DLL (s) Cygwin. Une application MinGW n’a pas besoin d’un runtime spécial.
Lisez ces 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, la comstackr une fois et l’exécuter sur toutes les plates-formes (par exemple Windows, Linux et Mac OS X …).
Réponse n ° 1: Écrivez votre code source dans JAVA. Comstackz 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 à comstackr le code source pour des plates-formes distinctes (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 adapté à toute plate-forme (par exemple, Visual Studio pour Windows, GCC pour Linux et XCode pour Mac). Notez que vous ne devez utiliser aucune fonctionnalité de programmation avancée pour comstackr correctement votre code source sur toutes les plates-formes. Si vous n’utilisez aucune classe ou fonction standard C ou C ++, votre code source ne comstack 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. Y at-il un compilateur multi-plateforme?
Réponse n ° 3: Oui, utilisez le compilateur GCC. C’est un compilateur multi-plateforme. Pour comstackr votre code source sous Windows, utilisez MinGW qui fournit le compilateur GCC pour Windows et comstack votre code source au programme Windows natif. N’utilisez aucune fonctionnalité de programmation avancée (telle que l’API Windows) pour comstackr correctement votre code source sur toutes les plates-formes. Si vous utilisez les fonctions de l’API Windows, votre code source ne comstack 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 telle que le multithreading. Que puis-je faire?
Réponse n ° 4: Vous devez utiliser la norme POSIX (Portable Operating System Interface [pour UNIX]). Il fournit de nombreux outils et fonctions de programmation avancés. De nombreux systèmes d’exploitation entièrement ou partiellement compatibles POSIX (tels que Mac OS X, Solaris, BSD / OS et …). Certains systèmes d’exploitation ne sont pas officiellement certifiés compatibles avec POSIX, mais sont en grande partie compatibles (comme Linux, FreeBSD, OpenSolaris et …). Cygwin fournit un environnement de développement et d’exécution largement compatible avec POSIX pour Microsoft Windows.
Ainsi:
Wikipedia dit :
MinGW
issu de la version 1.3.3 deCygwin
. Bien queCygwin
etMinGW
puissent tous deux être utilisés pour transférer le logicielUNIX
versWindows
, ils ont différentes approches:Cygwin
vise à fournir unePOSIX layer
complète qui émule plusieurs appels système et bibliothèques existant sousLinux
,UNIX
et les variantesBSD
. LaPOSIX layer
s’exécute au-dessus deWindows
, sacrifiant ainsi les performances si nécessaire pour assurer la compatibilité. Par conséquent, cette approche nécessite que les programmesWindows
écrits avecCygwin
s’exécutent au-dessus d’une bibliothèque de compatibilité copyleftée qui doit être dissortingbuée avec le programme, avec lesource code
du programme.MinGW
vise à fournir des fonctionnalités et des performances natives via desWindows API calls
directsWindows API calls
. Contrairement àCygwin
,MinGW
ne nécessite pas deDLL
couche de compatibilité et les programmes n’ont donc pas besoin d’être dissortingbués avecsource code
.Étant donné que
MinGW
dépend desWindows API calls
, il ne peut pas fournir unePOSIX API
complète. Il est impossible de comstackr certainesUNIX applications
pouvant être compilées avecCygwin
. Plus précisément, cela s’applique aux applications qui nécessitentPOSIX
fonctionnalitésPOSIX
telles quefork()
,mmap()
ouioctl()
et celles qui s’attendent à être exécutées dans unPOSIX environment
. Les applications écrites à l’aide d’unecross-platform library
qui a elle-même été scope surMinGW
, telles queSDL
,wxWidgets
,Qt
ouGTK+
, seront généralement compilées aussi facilement dansMinGW
que dansCygwin
.La combinaison de
MinGW
etMSYS
fournit un petit environnement autonome pouvant être chargé sur des supports amovibles sans laisser d’entrées ou de 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-comstack Windows applications
de manièrecross-comstack Windows applications
avecMinGW-GCC under POSIX systems
. Cela signifie que les développeurs n’ont pas besoin d’une installation Windows avecMSYS
pour comstackr des logiciels qui s’exécuteront sousWindows
sansCygwin
.
Du sharepoint vue du portage d’un programme C, un bon moyen de comprendre ceci est de prendre un exemple:
#include #include 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 comstackr ce programme avec Microsoft Visual C. Nous pouvons également comstackr ce programme avec MinGW et avec Cygwin.
Sous Microsoft Visual C, le programme sera lié à une bibliothèque d’exécution redissortingbuable mxvcrtnn.dll
: 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, non versionnée faisant partie de Windows et interdite à l’utilisation des applications. Cette bibliothèque est essentiellement un fork de la bibliothèque d’exécution redissortingbuable de MS Visual C pour une utilisation par Windows elle-même.
Dans les deux cas, le programme aura des comportements similaires:
stat
renvoie des informations très limitées, par exemple, aucune autorisation ou numéro d’inode utile. c:file.txt
est résolu en fonction du répertoire de travail actuel associé au lecteur c:
:. system
utilise cmd.exe /c
pour exécuter la commande externe. Nous pouvons également comstackr le programme sous Cygwin. Comme pour le runtime redissortingbuable 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). Cygwin étant désormais sous la licence LGPL, nous pouvons intégrer ce 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 comportent différemment:
stat
a des fonctionnalités riches, renvoyant des valeurs significatives dans la plupart des champs. c:file.txt
n’est pas du tout compris comme contenant une référence de 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 en quelque sorte mutilé. Il n’y a pas de concept de chemin d’access relatif sur un volume ou un lecteur dans Cygwin, pas de concept de “lecteur actuellement connecté” et pas de répertoire de travail actuel par lecteur. system
essaie d’utiliser l’interpréteur /bin/sh -c
. Cygwin va résoudre le /
path en fonction de l’emplacement de votre exécutable, et s’attendre à ce qu’un programme sh.exe
soit co-localisé avec votre exécutable. Cygwin et MinGW vous permettent d’utiliser les fonctions Win32. Si vous souhaitez appeler MessageBox
ou CreateProcess
, vous pouvez le faire. Vous pouvez également créer facilement un programme qui ne nécessite pas de fenêtre de console, en utilisant gcc -mwindows
, sous MinGW et Cygwin.
Cygwin n’est pas ssortingctement POSIX. En plus de fournir un access à 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 msvcrt.dll
re-dissortingbuables msvcrtnn.dll
). Un exemple de ceci est la famille de fonctions spawn*
comme spawnvp
. C’est une bonne idée à utiliser à la place de fork
et exec
sur Cygwin, car ils correspondent mieux au modèle de création de processus Windows qui n’a aucun 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, même en 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 réalité un inconvénient; il dépend d’un fork Windows interne non documenté de l’exécution 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 msvcrt.dll
sous GPL peuvent être compilés et redissortingbué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 des programmes POSIX. Comme il est maintenant sous la licence LGPL, il permet de redissortingbuer les applications avec toutes sortes de licences, open ou open 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 tcsetattr
et utilise les codes VT100 pour contrôler le curseur fonctionnera correctement 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.
Toutefois:
/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 en tant qu’argument ou une entrée d’une boîte de dialog, les utilisateurs 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 après l’annonce de la LGPL, j’ai démarré 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.dll
sans recompilation. 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 exécutable unique fonctionnant avec les chemins Windows sous forme d’application Windows avec Cygnal, et fonctionnant parfaitement avec les chemins Cygwin lorsqu’ils sont installés dans /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
.
Ne négligez pas le logiciel U / Win d’ AT & T , conçu pour vous aider à comstackr des applications Unix sur Windows (dernière version – 2012-08-06; utilise la licence publique Eclipse, version 1.0).
Comme Cygwin, ils doivent se lancer dans une bibliothèque. dans leur cas POSIX.DLL
. Les gars d’AT & T sont des ingénieurs formidables (le même groupe qui vous a apporté ksh et dot ) et leur travail vaut la peine d’être vérifié.
Cygwin émule l’intégralité de l’environnement POSIX, tandis que MinGW est un ensemble d’outils minimal pour la compilation uniquement (comstack une application Win native). Donc, si vous voulez que votre projet soit multi-plateforme, 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).
Pour utiliser Cygwin dans une application commerciale / propriétaire / non open source, vous devez débourser des dizaines de milliers de dollars pour un ” rachat de licence ” auprès 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. Au plus, vous pouvez vous attendre à fournir des détails de licence avec votre application, tels que la licence winpthreads requirejse 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 d’API trouvée dans le sous-répertoire winsup de Cygwin est maintenant dissortingbuée sous la licence 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 bifurquer – car fork () est pris en charge dans la DLL – la version mingw ne le pouvant pas. Ceci est un problème lorsque vous essayez de comstackr mysql depuis 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 de type Linux à part entière. En comparaison, MinGW et MSYS fournissent une couche POSIX de type léger et minimaliste, avec uniquement les outils les plus essentiels, tels que gcc
et bash
. En raison de l’approche plus minimaliste de MinGW, elle ne fournit pas le degré de couverture de l’API POSIX offert par Cygwin et ne peut donc pas créer certains programmes qui pourraient être compilés sur Cygwin.
En termes de code généré par les deux, la chaîne d’outils Cygwin repose sur la liaison dynamic à une bibliothèque d’exécution importante, cygwin1.dll
, tandis que la chaîne d’outils MinGW comstack le code sur les fichiers binarys msvcrt.dll
bibliothèque C native statiquement aux parties de glibc
. Les exécutables Cygwin sont donc plus compacts mais nécessitent une DLL redissortingbuable distincte, tandis que les binarys MinGW peuvent être livrés de manière autonome, 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 ressortingctions 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 à code source fermé 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 à source fermée, car les en-têtes et les bibliothèques font l’object d’une licence autorisée.
Cygwin est un environnement de type Unix et une interface de ligne de commande pour Microsoft Windows.
Mingw est un port logiciel natif de GNU Comstackr Collection (GCC) vers Microsoft Windows, ainsi qu’un ensemble de bibliothèques d’importation librement dissortingbuables et de fichiers d’en-tête pour l’API Windows. MinGW permet aux développeurs de créer des applications Microsoft Windows natives.
Vous pouvez exécuter des binarys générés avec mingw
sans l’environnement cygwin
, à condition que toutes les bibliothèques nécessaires soient présentes.
Cygwin
utilise une couche de compatibilité, tandis que MinGW
est native. C’est l’une des principales différences.