Quelle est la différence entre Cygwin et MinGW?

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:

    Pour tirer parti des avantages du compilateur multi-plateformes GCC sous Windows, utilisez MinGW.

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

    Wikipedia dit :

    MinGW issu de la version 1.3.3 de Cygwin . Bien que Cygwin et MinGW puissent tous deux être utilisés pour transférer le logiciel UNIX vers Windows , ils ont différentes approches: Cygwin vise à fournir une POSIX layer complète qui émule plusieurs appels système et bibliothèques existant sous Linux , UNIX et les variantes BSD . La POSIX layer s’exécute au-dessus de Windows , sacrifiant ainsi les performances si nécessaire pour assurer la compatibilité. Par conséquent, cette approche nécessite que les programmes Windows écrits avec Cygwin s’exécutent au-dessus d’une bibliothèque de compatibilité copyleftée qui doit être dissortingbuée avec le programme, avec le source code du programme. MinGW vise à fournir des fonctionnalités et des performances natives via des Windows API calls directs Windows API calls . Contrairement à Cygwin , MinGW ne nécessite pas de DLL couche de compatibilité et les programmes n’ont donc pas besoin d’être dissortingbués avec source code .

    Étant donné que MinGW dépend des Windows API calls , il ne peut pas fournir une POSIX API complète. Il est impossible de comstackr certaines UNIX applications pouvant être compilées avec Cygwin . Plus précisément, cela s’applique aux applications qui nécessitent POSIX fonctionnalités POSIX telles que fork() , mmap() ou ioctl() et celles qui s’attendent à être exécutées dans un POSIX environment . Les applications écrites à l’aide d’une cross-platform library qui a elle-même été scope sur MinGW , telles 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 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ère cross-comstack 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 comstackr des logiciels qui s’exécuteront sous Windows sans Cygwin .

    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:

    • La fonction stat renvoie des informations très limitées, par exemple, aucune autorisation ou numéro d’inode utile.
    • le chemin 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:

    • 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, 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.
    • la fonction 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:

    • En tant qu’outil de développement Windows natif, Cygwin a quelques particularités, comme la gestion des chemins qui sont étrangers à 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 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.