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?
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?
Réponses:
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.
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.
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
package Cygwin. MinGW-64 sera alors disponible en tant que x86_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 :
- 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 l'apparence de Linux.
Du site Web de Mingw :
MinGW ("Minimalistic GNU for Windows") est une collection de fichiers d'en-tête spécifiques à Windows disponibles gratuitement et librement distribuables et des bibliothèques d'importation combinées avec des jeux d'outils GNU qui permettent de produire des programmes Windows natifs qui ne dépendent d'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 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.
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…).
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 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…).
Réponse # 2: Écrivez votre code source en C ou C ++. Utilisez uniquement des fichiers d'en-tête standard. Utilisez un compilateur approprié pour n'importe quelle plate-forme (par exemple Visual Studio pour Windows, GCC pour Linux et XCode pour Mac). Notez que vous ne devez pas utiliser de fonctionnalités de programmation avancées pour compiler votre code source sur toutes les plates-formes avec succès. Si vous n'utilisez aucune classe ou fonction standard C ou C ++, votre code source ne se compile pas sur d'autres plates-formes.
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?
Réponse # 3: Oui, utilisez le compilateur GCC. Il s'agit d'un compilateur multiplateforme. Pour compiler votre code source dans Windows, utilisez MinGW qui fournit le compilateur GCC pour Windows et compile votre code source dans un programme Windows natif. N'utilisez aucune fonctionnalité de programmation avancée (comme l'API Windows) pour compiler votre code source sur toutes les plates-formes avec succès. Si vous utilisez les fonctions de l'API Windows, votre code source ne se compile 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 comme le multi-threading. Que puis-je faire?
Réponse # 4: Vous devez utiliser la norme POSIX (Portable Operating System Interface [for UNIX]). Il fournit de nombreuses fonctionnalités et outils de programmation avancés. De nombreux systèmes d'exploitation totalement ou partiellement compatibles POSIX (comme Mac OS X, Solaris, BSD / OS et ...). Certains systèmes d'exploitation, bien qu'ils ne soient pas officiellement certifiés compatibles POSIX, sont en grande partie conformes (comme Linux, FreeBSD, OpenSolaris et ...). Cygwin fournit un environnement de développement et d'exécution largement compatible POSIX pour Microsoft Windows.
Donc:
Du point de vue du portage d'un programme C, un bon moyen de comprendre cela 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 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ù se nn
trouve un suffixe de version. Pour expédier ce programme, nous devrons inclure cette DLL. Cette DLL fournit _stat
, system
et printf
. (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 lecteur c:
.system
les usages cmd.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) et cyggcc_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 il 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 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'un sh.exe
programme soit colocalisé 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 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 la spawn*
famille de fonctions comme spawnvp
. Il s'agit d'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 pas de concept fork
.
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 et termios
, qui fonctionnent avec la console Microsoft! Une application POSIX qui configure le mode brut avec tcsetattr
et utilise des codes VT100 pour contrôler le curseur fonctionnera directement dans la cmd.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 de cygwin1.dll
, ce chemin n'aura aucun sens, alors qu'il comprendra c:foo.txt
.
MinGW
dérivé de la version 1.3.3 deCygwin
. Bien que les deuxCygwin
etMinGW
peut être utilisé pour le portUNIX
logicielWindows
, ils ont des approches différentes:Cygwin
vise à fournir une solution complètePOSIX layer
qui fournit des émulations de plusieurs appels système et les bibliothèques qui existent surLinux
,UNIX
et lesBSD
variantes. LesPOSIX layer
courses sur le dessusWindows
, sacrifiant les performances lorsque cela est nécessaire pour la compatibilité. Par conséquent, cette approche nécessite que lesWindows
programmes écrits avecCygwin
s'exécutent au-dessus d'une bibliothèque de compatibilité copyleftée qui doit être distribuée avec le programme, avec le programmesource code
.MinGW
vise à fournir des fonctionnalités et des performances natives via directWindows API calls
. A la différenceCygwin
,MinGW
ne nécessite pas de couche de compatibilitéDLL
et donc les programmes n'ont pas besoin d'être distribués avecsource code
.Parce qu'il
MinGW
dépendWindows API calls
, il ne peut pas fournir un pleinPOSIX API
; il ne peut pas en compiler certainsUNIX applications
qui peuvent être compilés avecCygwin
. Plus précisément, cela s'applique aux applications qui nécessitent desPOSIX
fonctionnalités telles quefork()
,mmap()
ou àioctl()
celles qui s'attendent à être exécutées dans aPOSIX environment
. Les applications écrites à l' aide d' uncross-platform library
qui lui - même a été portéMinGW
, commeSDL
,wxWidgets
,Qt
ouGTK+
, compileront généralement aussi facilement dansMinGW
comme ils le feraient dansCygwin
.La combinaison de
MinGW
etMSYS
fournit un petit environnement autonome qui peut être chargé sur un support amovible sans laisser d'entrées dans le registre ou de fichiers sur l'ordinateur.Cygwin
Portable offre une fonctionnalité similaire. En fournissant plus de fonctionnalités,Cygwin
devient plus compliqué à installer et à entretenir.Il est également possible de le faire
cross-compile Windows applications
avecMinGW-GCC under POSIX systems
. Cela signifie que les développeurs n'ont pas besoin d'une installation Windows avecMSYS
pour compiler des logiciels qui s'exécuterontWindows
sansCygwin
.
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.
D'autres réponses ont déjà atteint la cible. Je veux juste ajouter une illustration pour une capture rapide.
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).
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.
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.
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 Windows msvcrt.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.
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.
Cygwin
utilise une couche de compatibilité, tandis qu'il MinGW
est natif. C'est l'une des principales différences.