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 pourrai exécuter le binaire sur un système sans Cygwin / MinGW?
Pour simplifier, 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
Le but de Cygwin est de faciliter le portage des applications basées sur Unix vers Windows, en émulant la plupart des petits détails fournis par les systèmes d'exploitation basés sur Unix et qui sont documentés par les normes POSIX . Votre application peut utiliser la fonction Unix tels que des tuyaux, de fichiers Unix et l' accès au répertoire, et ainsi de suite, et il peut être compilé avec Cygwin qui agira en tant que couche de compatibilité autour de votre application, de sorte que beaucoup de ces paradigmes spécifiques Unix peuvent continuer à être utilisé.
Lorsque vous distribuez votre logiciel, le destinataire devra l'exécuter avec l'environnement d'exécution Cygwin (fourni par le fichier cygwin1.dll
). Vous pouvez distribuer cela avec votre logiciel, mais votre logiciel devra se conformer à sa licence open source. Il se peut même que même en reliant simplement votre logiciel à celui-ci, mais en distribuant la DLL séparément, vous devrez peut-être honorer la licence open source.
À propos de MinGW
MinGW vise simplement à être un port Windows des outils du compilateur GNU, tels que GCC, Make, Bash, etc. Il n'essaie pas d'émuler ou de fournir une compatibilité complète avec Unix, mais à la place, il fournit 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 en conséquence, votre application doit être spécifiquement programmée pour pouvoir s'exécuter dans Windows, ce qui peut signifier une modification importante si elle a été créée pour pouvoir ê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 le 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, car vous utilisez essentiellement la suite d'outils de compilation GNU.
MinGW est essentiellement une alternative au compilateur Microsoft Visual C ++ et à ses outils de liaison / création associés. Il peut être possible dans certains cas d'utiliser MinGW pour compiler quelque chose qui était destiné à être compilé avec Microsoft Visual C ++, avec les bonnes bibliothèques et dans certains cas avec d'autres modifications.
MinGW comprend quelques bibliothèques standard de base pour interagir avec le système d'exploitation Windows, mais comme avec les bibliothèques standard normales incluses dans la collection de compilateurs GNU, elles n'imposent pas de restrictions de licence sur les logiciels que vous avez créés.
Pour les applications logicielles non triviales, les rendre multiplateformes peut être un défi considérable à moins que vous n'utilisiez un cadre multiplateforme complet. Au moment où j'ai écrit cela, le framework Qt était l'un des plus populaires à cet effet, permettant la construction d'applications graphiques qui fonctionnent sur tous les systèmes d'exploitation, y compris Windows, mais il existe également d'autres options. Si vous utilisez un tel framework depuis le début, vous pouvez non seulement réduire vos maux de tête quand vient le temps de porter sur une autre plateforme, mais vous pouvez utiliser les mêmes widgets graphiques - fenêtres, menus et contrôles - sur toutes les plateformes si vous écrivez un GUI app, et les faire apparaître natif pour l'utilisateur.
Cygwin est une tentative de création d'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 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 sur de telles DLL - vous n'avez besoin que des runtimes 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 du tout toutes les fonctionnalités de Cygwin, mais est idéal pour les programmeurs qui souhaitent utiliser MinGW.
la source
Pour ajouter aux autres réponses, Cygwin est livré avec les bibliothèques et en-têtes MinGW et vous pouvez compiler sans créer de lien vers cygwin1.dll en utilisant l'option -mno-cygwin avec gcc. Je préfère grandement cela à l'utilisation de MinGW et MSYS standard.
la source
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
package Cygwin. MinGW-64 sera alors disponible en tant quex86_64-w64-mingw32-gcc
commande mal nommée . S'il vous plaît Dieu (s), quelqu'un unifie déjà les noms de ces choses sanglantes.Wikipédia fait une comparaison ici .
Depuis le site Web de Cygwin :
Du site Web de Mingw :
la source
Cygwin utilise une DLL, cygwin.dll (ou peut-être un ensemble de DLL) pour fournir un runtime de type POSIX sur Windows.
MinGW compile dans une application Win32 native.
Si vous construisez quelque chose avec Cygwin, tout système sur lequel vous l'installez aura également besoin des DLL Cygwin. Une application MinGW ne nécessite aucun runtime spécial.
la source
Lisez ces réponses aux 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, le compile une fois et l'exécute sur toutes les plates-formes (par exemple Windows, Linux et Mac OS X…).
Question # 2: Je veux créer une application que j'écris une fois le code source mais il n'y a aucun problème que je compile le code source pour toutes les plates-formes séparément (par exemple Windows, Linux et Mac OS X…).
Question # 3: En réponse à la question # 2, il est difficile d'utiliser un compilateur différent pour chaque plateforme, existe-t-il un compilateur multi-plateforme?
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?
Donc:
Pour utiliser l'avantage du compilateur multiplateforme GCC sous Windows, utilisez MinGW.
Pour utiliser les fonctionnalités et outils de programmation avancée standard POSIX sous Windows, utilisez Cygwin.
la source
Du point de vue du portage d'un programme C, un bon moyen de comprendre cela est de prendre un exemple:
Si nous passons
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ù senn
trouve un suffixe de version. Pour expédier ce programme, nous devrons inclure cette DLL. Cette DLL fournit_stat
,system
etprintf
. (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 et non versionnée qui fait partie de Windows et interdite à l'utilisation des applications. Cette bibliothèque est essentiellement un fork 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:
stat
fonction renverra des informations très limitées - pas d'autorisations utiles ou de numéro d'inode, par exemple.c:file.txt
est résolu en fonction du répertoire de travail actuel associé au lecteurc:
.system
les usagescmd.exe /c
pour exécuter la commande externe.Nous pouvons également compiler le programme sous Cygwin. De manière similaire à 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) etcyggcc_s-1.dll
(prise en charge de l'exécution GCC). Puisque Cygwin est maintenant sous LGPL, nous pouvons emballer avec notre programme, même si ce n'est pas un logiciel gratuit compatible GPL, et expédier le programme.Sous Cygwin, les fonctions de la bibliothèque se comporteront différemment:
stat
fonction 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, car ilc:
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 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.system
fonction essaie d'utiliser l'/bin/sh -c
interpréteur. Cygwin résoudra le/
chemin en fonction de l'emplacement de votre exécutable et s'attend à ce qu'unsh.exe
programme soit colocalisé avec votre exécutable.Cygwin et MinGW vous permettent d'utiliser les fonctions Win32. Si vous souhaitez appeler
MessageBox
ouCreateProcess
, vous pouvez le faire. Vous pouvez également facilement créer un programme qui ne nécessite pas de fenêtre de console, en utilisantgcc -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'msvcrtnn.dll
exécution redistribuables ). Un exemple de ceci est laspawn*
famille de fonctions commespawnvp
. Il s'agit d'une bonne idée à utiliser à la place defork
etexec
sur Cygwin car ils correspondent mieux au modèle de création de processus Windows qui n'a pas de conceptfork
.Donc:
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 du langage de programmation sous Windows devraient fournir leur propre exécution, même les implémentations du 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 fait un inconvénient; il dépend d'un fork non documenté, interne à Windows, de l'exécution de 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 GPL peuvent être compilés et redistribué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 de programmes POSIX. Désormais sous LGPL, il permet de redistribuer des applications avec toutes sortes de licences, open ou closed source. Cygwin contient même l'émulation VT100 ettermios
, qui fonctionnent avec la console Microsoft! Une application POSIX qui configure le mode brut avectcsetattr
et utilise des codes VT100 pour contrôler le curseur fonctionnera directement dans lacmd.exe
fenêtre. En ce qui concerne l'utilisateur final, il s'agit d'une application de console native effectuant des appels Win32 pour contrôler la console.Toutefois:
/bin/sh
et d'autres problèmes. Ces différences rendent les programmes Cygwin «non natifs». Si un programme prend un chemin en argument ou en entrée à partir 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 cela ne fonctionne pas de cette façon, c'est un problème.Plug: Peu de temps après l'annonce de LGPL, j'ai lancé 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. À mesure que cette bibliothèque s'améliore, 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 qu'application Windows avec Cygnal, et fonctionne parfaitement 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 établit une liaison avec la version Cygnal decygwin1.dll
, ce chemin n'aura aucun sens, alors qu'il comprendrac:foo.txt
.la source
Wikipedia dit :
la source
apt-cyg
car c'est peut-être encore plus facile que d'utiliser apt sous WSL.Ne négligez pas les AT & Tlogiciel U / Win d', qui est conçu pour vous aider à compiler les applications Unix sur Windows (dernière version - 06/08/2012; utilise la licence publique Eclipse, version 1.0).
Comme Cygwin, ils doivent fonctionner contre une bibliothèque; dans leur cas
POSIX.DLL
. Les gars d'AT & T sont d'excellents ingénieurs (le même groupe qui vous a apporté ksh et dot ) et leurs trucs valent la peine d'être vérifiés.la source
D'autres réponses ont déjà atteint la cible. Je veux juste ajouter une illustration pour une capture rapide.
la source
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 rendre votre projet multiplateforme, le choix entre les deux est évident, MinGW.
Bien que vous puissiez envisager d'utiliser VS sous Windows, GCC sous Linux / Unices. La plupart des projets open source le font (par exemple Firefox ou Python).
la source
clang
une solution multiplateforme viable.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 - là où la version mingw ne peut pas. C'est un problème lorsque vous essayez de compiler mysql à partir des sources.
la source
Pour utiliser Cygwin dans une application commerciale / propriétaire / non open-source, vous devrez débourser des dizaines de milliers de dollars pour un « rachat de licence » 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 de ce type n'est engagé et les licences (PD, BSD, MIT) sont extrêmement permissives. Au maximum, vous devrez peut- être fournir des détails de licence avec votre application, tels que la licence winpthreads requise lors de 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 winsup de Cygwin est maintenant distribuée sous la LGPL, par opposition à la GPL complète.
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 légère et minimaliste de type POSIX, avec seulement les outils les plus essentiels comme
gcc
etbash
disponibles. En raison de l'approche plus minimaliste de MinGW, elle ne fournit pas le degré de couverture API POSIX qu'offre Cygwin et ne peut donc pas créer certains programmes qui pourraient autrement être compilés sur Cygwin.En termes de code généré par les deux, la chaîne d'outils Cygwin repose sur une liaison dynamique vers une grande bibliothèque d'exécution
cygwin1.dll
, tandis que la chaîne d'outils MinGW compile du code vers des fichiers binaires qui se lient dynamiquement à la bibliothèque C native de Windowsmsvcrt.dll
ainsi que statiquement à des parties deglibc
. Les exécutables Cygwin sont donc plus compacts mais nécessitent une DLL redistribuable distincte, tandis que les binaires MinGW peuvent être livrés autonomes 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 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 conformes OSI, donc les développeurs souhaitant créer une application de source fermée autour de Cygwin doivent acquérir une licence commerciale de Red Hat. D'un autre côté, le code MinGW peut être utilisé à la fois dans des applications open source et fermées, étant donné que les en-têtes et les bibliothèques sont autorisés sous licence.
la source
Cygwin est un environnement de type Unix et une interface de ligne de commande pour Microsoft Windows.
Mingw est un port logiciel natif de la collection de compilateurs GNU (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 Microsoft Windows natives.
Vous pouvez exécuter des fichiers binaires générés
mingw
sans l'cygwin
environnement, à condition que toutes les bibliothèques (DLL) nécessaires soient présentes.la source
Cygwin
utilise une couche de compatibilité, tandis qu'ilMinGW
est natif. C'est l'une des principales différences.la source