Question Quelle est la différence entre Cygwin et MinGW?


Je veux transformer mon projet C ++ en 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 en mesure d'exécuter le binaire sur un système sans Cygwin / MinGW?


533
2018-04-21 09:16


origine


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 les fenêtres.

À propos de Cygwin

Le but de Cygwin est de faciliter grandement le portage des applications * nix vers Windows en reproduisant un grand nombre des petits détails fournis par les systèmes d'exploitation Unix. POSIX normes. Si votre application suppose qu'elle peut utiliser la fonctionnalité Unix, telle que les tuyaux, l'accès aux fichiers et répertoires de type Unix, etc., vous pouvez la compiler dans Cygwin et Cygwin lui-même agira comme couche de compatibilité autour de votre application, de sorte que beaucoup de ces paradigmes spécifiques à Unix puissent continuer à être utilisés avec peu ou pas de modifications à votre application.

Si vous souhaitez compiler quelque chose pour Cygwin et distribuer l'application résultante, vous devez également distribuer l'environnement d'exécution Cygwin (fourni par cygwin1.dll) avec, et cela a des implications pour les types de licences de logiciels que vous pouvez utiliser.

À propos de 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 fournit plutôt l'environnement minimum nécessaire pour utiliser GCC (le compilateur GNU) et un petit nombre d'autres outils sur Windows. Il n'a pas de couche d'émulation Unix comme Cygwin, mais votre application doit être spécifiquement programmée pour pouvoir fonctionner sous Windows, ce qui peut signifier une altération significative si elle a été créée pour fonctionner dans un environnement Unix standard et utilise des fonctionnalités spécifiques à Unix telles que celles mentionnées plus haut. Par défaut, le code compilé dans 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. MinGW est une alternative open-source à Microsoft Visual C ++ compilateur et ses outils de liaison / création associés.

Il existe des frameworks multiplateformes très sophistiqués qui facilitent le portage d'applications vers différents systèmes d'exploitation - par exemple Qt framework est un cadre populaire pour les applications multi-plateforme. Si vous utilisez un tel framework depuis le début, vous pouvez non seulement réduire vos maux de tête au moment du port vers une autre plateforme, mais vous pouvez utiliser les mêmes widgets graphiques - fenêtres, menus et contrôles - sur toutes les plates-formes si vous écrivez Application graphique


502
2018-04-27 03:15



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 Cela 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 vis-à-vis de ces DLL - vous avez seulement besoin des temps d'exécution 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 toutes les fonctionnalités de Cygwin, mais il est idéal pour les programmeurs qui veulent utiliser MinGW.


297
2018-04-21 09:21



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


134
2018-04-27 06:28



Wikipedia fait une comparaison ici.

De Cygwin's site Internet:

  • 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 substantielles de l'API Linux.
  • Une collection d'outils qui fournissent l'aspect et la sensation de Linux.

De Mingw site Internet:

MinGW ("Minimalistic GNU for Windows") est un ensemble de fichiers d'en-tête et de bibliothèques d'importation Windows librement disponibles et librement distribuables, combinés à des outils GNU permettant de produire des programmes Windows natifs qui ne reposent sur aucune DLL d'exécution tierce.


59
2018-04-21 09:21



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

MinGW compile à une application native de Win32.

Si vous construisez quelque chose avec Cygwin, tout système sur lequel vous l'installerez aura aussi besoin de la ou des DLL (s) Cygwin. Une application MinGW n'a pas besoin d'exécution spéciale.


42
2018-04-21 09:20



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


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

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


Question n ° 2: Je veux créer une application dans laquelle j'écris du code source une fois mais il n'y a aucun problème à compiler le code source pour toutes les plateformes séparément (par exemple Windows, Linux et Mac OS X ...).

Réponse n ° 2: Écrivez votre code source en C   ou C ++. Utiliser des fichiers d'en-tête standard   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 devriez pas utiliser   fonctions de programmation avancées à   compiler votre code source dans tous   plates-formes avec succès. Si tu utilises   aucune classe standard C ou C ++ ou   fonctions, votre code source ne   compiler sur d'autres plateformes.


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 n ° 3: Oui, utilisez le compilateur GCC. Il   est un compilateur multi-plateforme. À   compiler votre code source dans Windows   utilisation MinGW qui fournit le compilateur GCC   pour Windows et compile votre source   code au programme Windows natif. Ne pas   utiliser des fonctionnalités de programmation avancées   (comme Windows API) pour compiler votre   code source sur toutes les plateformes   avec succès. Si vous utilisez l'API Windows   fonctions, votre code source ne   compiler sur d'autres plateformes.


Question n ° 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 n ° 4: Vous devriez utiliser POSIX   (Interface du système d'exploitation portable   [pour UNIX]) standard. Il fournit de nombreux   fonctionnalités 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 ...). Certains   systèmes d'exploitation alors que non officiellement   certifié comme compatible POSIX, conforme   en grande partie (comme Linux, FreeBSD,   OpenSolaris et ...). Cygwin fournit   un développement largement conforme à POSIX   et environnement d'exécution pour Microsoft   Les fenêtres.


Ainsi:

Pour utiliser l'avantage du compilateur de plate-forme croisée de GCC dans Windows, utilisez MinGW.

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


38
2018-04-01 00:06



Wikipedia dit:

MinGW fourchu à partir de la version 1.3.3 de Cygwin. Bien que les deux Cygwin   et MinGW peut être utilisé pour mettre en communication UNIX logiciel à Windows, ils   avoir des approches différentes: Cygwin vise à fournir une complète POSIX layer    qui fournit des émulations de plusieurs appels système et bibliothèques   qui existe sur Linux, UNIX, et le BSD variantes. le POSIX layer   fonctionne au-dessus de Windows, sacrifiant la performance où   nécessaire pour la compatibilité. En conséquence, cette approche nécessite    Windows programmes écrits avec Cygwin courir au sommet d'un copylefted   bibliothèque de compatibilité qui doit être distribué avec le programme, le long   avec le programme source code. MinGW vise à fournir natif   fonctionnalité et performance via direct Windows API calls. contrairement à    Cygwin, MinGW ne nécessite pas de couche de compatibilité DLL et   ainsi les programmes n'ont pas besoin d'être distribués avec source code.

Car MinGW dépend de Windows API calls, ça ne peut pas   fournir une pleine POSIX API; il est incapable de compiler certains UNIX applications qui peut être compilé avec Cygwin. Plus précisément, cela   s'applique aux applications qui nécessitent POSIX fonctionnalité comme    fork(), mmap() ou ioctl() et ceux qui s'attendent à être exécuté dans un    POSIX environment. Applications écrites en utilisant un cross-platform library qui a lui-même été porté à MinGW, tel que SDL,    wxWidgets, Qt, ou GTK+, compilera habituellement aussi facilement dans    MinGW comme ils le feraient Cygwin.

La combinaison de MinGW et MSYS fournit un petit, autonome   environnement qui peut être chargé sur un support amovible sans quitter   entrées dans le registre ou des 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 avec    MinGW-GCC under POSIX systems. Cela signifie que les développeurs ne   besoin d'une installation de Windows avec MSYS pour compiler un logiciel qui va   courir Windows sans pour autant Cygwin.


23
2017-07-06 18:48



Du point de vue du portage d'un programme C, un bon moyen de le comprendre 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. 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 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 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 à partir de MS Visual C pour une utilisation par Windows elle-même.

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

  • la stat La fonction retournera 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é à la commande c:.
  • system les usages cmd.exe /c pour exécuter la commande externe.

Nous pouvons également compiler le programme sous Cygwin. Similairement à 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 (Support d'exécution de GCC). Depuis Cygwin est maintenant sous la LGPL, nous pouvons empaqueter avec notre programme, même si ce 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 stat fonction a une fonctionnalité riche, 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 une partie du nom et en quelque sorte détruit dedans. Il n'y a pas de concept de chemin relatif par rapport à 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 system fonction essaie d'utiliser le /bin/sh -c interprète. Cygwin va résoudre le / chemin en fonction de l'emplacement de votre exécutable, et attendez un sh.exe programme à co-localiser avec votre exécutable.

Les deux Cygwin et MinGW vous permettent d'utiliser les fonctions Win32. Si vous voulez 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 strictement POSIX. En plus de fournir un accès à l'API Windows, il fournit également ses propres implémentations de certaines fonctions de Microsoft C (des éléments trouvés dans msvcrt.dll ou le re-distribuable msvcrtnn.dll run-times). Un exemple de ceci est le spawn* famille de fonctions comme spawnvp. Ce sont une bonne idée à utiliser au lieu de fork et execsur Cygwin, car ils 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 pour nécessiter l'accompagnement de bibliothèques. Les implémentations de langage de programmation sous Windows devraient fournir leurs propres implémentations en langage C, même au moment de l'exécution. 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; il dépend d'une fourche interne à Windows de l'exécution de Visual C non documentée. 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.

  • 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. Puisqu'il est maintenant sous la LGPL, il permet de redistribuer des applications avec toutes sortes de licences, open source ou closed source. Cygwin contient même une é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 le cmd.exe fenêtre. En ce qui concerne l'utilisateur final, c'est 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 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 en tant qu'argument ou une entrée d'une boîte de dialogue, les utilisateurs Windows s'attendent à ce que ce chemin fonctionne de la même manière que dans les autres programmes Windows. Si ça ne fonctionne pas comme ça, c'est un problème.

Prise de courant: Peu de temps après l'annonce de la LGPL, j'ai commencé Cygnal (Cygwin Native Application Library) projet pour fournir une fourche 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. À mesure que cette bibliothèque s'améliorera, elle éliminera progressivement le besoin de MinGW.

Lorsque Cygnal résoudra le problème de gestion de chemin, il sera possible de développer un exécutable unique qui fonctionne avec les chemins Windows lorsqu'il est envoyé en tant qu'application Windows avec Cygnal, et qui 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.


17
2018-04-27 02:15



Ne pas oublier AT & T Tu gagne 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 point) et leurs affaires valent le détour.


14
2018-04-21 09:19



Cygwin émule tout l'environnement POSIX, tandis que MinGW est un ensemble d'outils minimal pour la compilation uniquement (compile l'application native Win.) Donc, si vous voulez rendre votre projet multiplate-forme, 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).


10
2017-09-18 12:32