Zur Vereinfachung ist es so:
Über Cygwin
Der Zweck von Cygwin besteht darin, die Portierung von Unix-basierten Anwendungen auf Windows erheblich zu vereinfachen, indem viele der kleinen Details emuliert werden, die Unix-basierte Betriebssysteme bieten und die durch die POSIX- Standards dokumentiert sind . Ihre Anwendung kann Unix-Funktionen wie Pipes, Datei- und Verzeichniszugriff im Unix-Stil usw. verwenden und mit Cygwin kompiliert werden, das als Kompatibilitätsebene für Ihre Anwendung fungiert, sodass viele dieser Unix-spezifischen Paradigmen dies können weiterhin verwendet werden.
Wenn Sie Ihre Software verteilen, muss der Empfänger sie zusammen mit der Cygwin-Laufzeitumgebung (von der Datei bereitgestellt cygwin1.dll
) ausführen . Sie können dies mit Ihrer Software vertreiben, aber Ihre Software muss der Open Source-Lizenz entsprechen. Es kann sogar vorkommen, dass Sie die Open-Source-Lizenz einhalten müssen, wenn Sie nur Ihre Software damit verknüpfen, die DLL jedoch separat verteilen.
Über MinGW
MinGW soll einfach ein Windows-Port der GNU-Compiler-Tools wie GCC, Make, Bash usw. sein. Es wird nicht versucht, Unix zu emulieren oder eine umfassende Kompatibilität mit Unix bereitzustellen, sondern es wird die erforderliche Mindestumgebung für die Verwendung von GCC (dem GNU-Compiler) und einer kleinen Anzahl anderer Tools unter Windows bereitgestellt. Es verfügt nicht über eine Unix-Emulationsebene wie Cygwin. Daher muss Ihre Anwendung speziell für die Ausführung unter Windows programmiert werden. Dies kann erhebliche Änderungen bedeuten, wenn sie erstellt wurde, um in einer Standard-Unix-Umgebung ausgeführt zu werden verwendet Unix-spezifische Funktionen wie die zuvor genannten. Standardmäßig wird in MinGWs GCC kompilierter Code in ein natives Windows X86-Ziel kompiliert, einschließlich EXE- und DLL-Dateien. Sie können jedoch auch mit den richtigen Einstellungen kompilieren, da Sie grundsätzlich die GNU-Compiler-Toolsuite verwenden.
MinGW ist im Wesentlichen eine Alternative zum Microsoft Visual C ++ - Compiler und den zugehörigen Linking / Make-Tools. In einigen Fällen kann es möglich sein, MinGW zu verwenden, um etwas zu kompilieren, das zum Kompilieren mit Microsoft Visual C ++ vorgesehen war, mit den richtigen Bibliotheken und in einigen Fällen mit anderen Änderungen.
MinGW enthält einige grundlegende Standardbibliotheken für die Interaktion mit dem Windows-Betriebssystem. Wie bei den normalen Standardbibliotheken in der GNU-Compilersammlung gelten jedoch keine Lizenzbeschränkungen für von Ihnen erstellte Software.
Für nicht triviale Softwareanwendungen kann es eine erhebliche Herausforderung sein, sie plattformübergreifend zu gestalten, es sei denn, Sie verwenden ein umfassendes plattformübergreifendes Framework. Zu der Zeit, als ich dies schrieb, war das Qt-Framework eines der beliebtesten für diesen Zweck und ermöglichte die Erstellung grafischer Anwendungen, die unter Betriebssystemen einschließlich Windows funktionieren, aber es gibt auch andere Optionen. Wenn Sie ein solches Framework von Anfang an verwenden, können Sie nicht nur Ihre Kopfschmerzen beim Portieren auf eine andere Plattform reduzieren, sondern Sie können auch alle grafischen Widgets - Fenster, Menüs und Steuerelemente - auf allen Plattformen verwenden, wenn Sie eine schreiben GUI-App, und lassen Sie sie dem Benutzer nativ erscheinen.
Cygwin ist ein Versuch, eine vollständige UNIX / POSIX-Umgebung unter Windows zu erstellen. Dazu werden verschiedene DLLs verwendet. Während diese DLLs von GPLv3 + abgedeckt werden, enthält ihre Lizenz eine Ausnahme , die nicht erzwingt, dass ein abgeleitetes Werk von GPLv3 + abgedeckt wird. MinGW ist eine C / C ++ - Compilersuite, mit der Sie ausführbare Windows-Dateien ohne Abhängigkeit von solchen DLLs erstellen können. Sie benötigen nur die normalen MSVC-Laufzeiten, die Teil einer normalen Microsoft Windows-Installation sind.
Sie können auch eine kleine UNIX / POSIX-ähnliche Umgebung erhalten, die mit MinGW namens MSYS kompiliert wurde . Es bietet nicht annähernd alle Funktionen von Cygwin, ist jedoch ideal für Programmierer, die MinGW verwenden möchten.
quelle
Um die anderen Antworten zu ergänzen, enthält Cygwin die MinGW-Bibliotheken und -Header. Sie können kompilieren, ohne eine Verknüpfung zur cygwin1.dll herzustellen, indem Sie das Flag -mno-cygwin mit gcc verwenden. Ich ziehe dies der Verwendung von einfachem MinGW und MSYS vor.
quelle
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
Cygwin-Paket, um MinGW-64 zu installieren (so ziemlich das, was Sie heutzutage immer wollen ) . MinGW-64 wird dann als ungeschickt benannterx86_64-w64-mingw32-gcc
Befehl verfügbar sein . Bitte Gott (e), jemand vereint bereits die Namen dieser blutigen Dinge.Wikipedia hat einen Vergleich hier .
Von Cygwins Website :
Von Mingws Website :
quelle
Cygwin verwendet eine DLL, cygwin.dll (oder möglicherweise eine Reihe von DLLs), um eine POSIX-ähnliche Laufzeit unter Windows bereitzustellen.
MinGW wird zu einer nativen Win32-Anwendung kompiliert.
Wenn Sie etwas mit Cygwin erstellen, benötigt jedes System, auf dem Sie es installieren, auch die Cygwin-DLL (s). Eine MinGW-Anwendung benötigt keine spezielle Laufzeit.
quelle
Lesen Sie diese beantworteten Fragen, um den Unterschied zwischen Cygwin und MinGW zu verstehen.
Frage 1: Ich möchte eine Anwendung erstellen, bei der ich den Quellcode einmal schreibe, einmal kompiliere und auf allen Plattformen (z. B. Windows, Linux und Mac OS X…) ausführe.
Frage 2: Ich möchte eine Anwendung erstellen, bei der ich den Quellcode einmal schreibe, aber es gibt kein Problem, dass ich den Quellcode für alle Plattformen separat kompiliere (z. B. Windows, Linux und Mac OS X…).
Frage 3: Bei der Beantwortung von Frage 2 ist es schwierig, für jede Plattform einen anderen Compiler zu verwenden. Gibt es einen plattformübergreifenden Compiler?
Frage 4: C- oder C ++ - Standardheaderdateien bieten keine erweiterten Programmierfunktionen wie Multithreading. Was kann ich machen?
Somit:
Verwenden Sie MinGW, um den plattformübergreifenden GCC-Compiler in Windows zu nutzen.
Verwenden Sie Cygwin, um die erweiterten Programmierfunktionen und -tools von POSIX in Windows zu nutzen.
quelle
Unter dem Gesichtspunkt der Portierung eines C-Programms können Sie dies am besten anhand eines Beispiels verstehen:
Wenn wir ändern
stat
zu_stat
können wir dieses Programm mit Microsoft Visual C kompilieren. Wir können dieses Programm auch mit MinGW und mit Cygwin kompilieren.Unter Microsoft Visual C wird das Programm mit einer MSVC-umverteilbaren Laufzeitbibliothek verknüpft:
mxvcrtnn.dll
Hiernn
befindet sich ein Versionssuffix. Um dieses Programm zu versenden, müssen wir diese DLL einschließen. Das DLL stellt_stat
,system
undprintf
. (Wir haben auch die Möglichkeit, die Laufzeit statisch zu verknüpfen.)Unter MinGW wird das Programm mit
msvcrt.dll
einer internen, nicht dokumentierten, nicht versionierten Bibliothek verknüpft , die Teil von Windows ist und für die Verwendung durch Anwendungen nicht zulässig ist. Diese Bibliothek ist im Wesentlichen ein Zweig der weiterverteilbaren Laufzeitbibliothek von MS Visual C zur Verwendung durch Windows.In beiden Fällen weist das Programm ein ähnliches Verhalten auf:
stat
Funktion gibt nur sehr begrenzte Informationen zurück, z. B. keine nützlichen Berechtigungen oder Inode-Nummern.c:file.txt
wird gemäß dem aktuellen Arbeitsverzeichnis aufgelöst, das dem Laufwerk zugeordnet istc:
.system
wirdcmd.exe /c
zum Ausführen des externen Befehls verwendet.Wir können das Programm auch unter Cygwin kompilieren. Ähnlich wie die von MS Visual C verwendete umverteilbare Laufzeit wird das Cygwin-Programm mit den Laufzeitbibliotheken von Cygwin verknüpft:
cygwin1.dll
(Cygwin selbst) undcyggcc_s-1.dll
(GCC-Laufzeitunterstützung). Da Cygwin jetzt unter der LGPL steht, können wir mit unserem Programm verpacken, auch wenn es keine GPL-kompatible freie Software ist, und das Programm ausliefern.Unter Cygwin verhalten sich die Bibliotheksfunktionen anders:
stat
Funktion verfügt über umfangreiche Funktionen und gibt in den meisten Feldern aussagekräftige Werte zurück.c:file.txt
enthält überhaupt keine Laufwerksbuchstabenreferenz, dac:
kein Schrägstrich folgt. Der Doppelpunkt wird als Teil des Namens betrachtet und irgendwie verstümmelt. In Cygwin gibt es kein Konzept für einen relativen Pfad für ein Volume oder Laufwerk, kein Konzept für "aktuell protokolliertes Laufwerk" und kein aktuelles Arbeitsverzeichnis pro Laufwerk.system
Funktion versucht, den/bin/sh -c
Interpreter zu verwenden. Cygwin löst den/
Pfad entsprechend dem Speicherort Ihrer ausführbaren Datei auf und erwartet, dass sich einsh.exe
Programm zusammen mit Ihrer ausführbaren Datei befindet.Sowohl Cygwin als auch MinGW ermöglichen die Verwendung von Win32-Funktionen. Wenn Sie anrufen möchten
MessageBox
oderCreateProcess
, können Sie dies tun. Sie könnengcc -mwindows
unter MinGW und Cygwin auch problemlos ein Programm erstellen, für das kein Konsolenfenster erforderlich ist .Cygwin ist nicht ausschließlich POSIX. Zusätzlich zum Zugriff auf die Windows-API bietet es auch eigene Implementierungen einiger Microsoft C-Funktionen (Dinge, die in
msvcrt.dll
oder die wiederverteilbarenmsvcrtnn.dll
Laufzeiten enthalten sind). Ein Beispiel hierfür sind diespawn*
Funktionsfamilien wiespawnvp
. Diese sind eine gute Idee anstelle vonfork
undexec
auf Cygwin, da sie besser auf das Windows-Modell zur Prozesserstellung abgebildet werden, für das es kein Konzept gibtfork
.Somit:
Cygwin-Programme sind nicht weniger "nativ" als MS Visual C-Programme, da sie die Begleitung von Bibliotheken erfordern. Von Programmiersprachenimplementierungen unter Windows wird erwartet, dass sie ihre eigene Laufzeit bereitstellen, sogar C-Sprachimplementierungen. Unter Windows gibt es keine "libc" für den öffentlichen Gebrauch.
Die Tatsache, dass MinGW keine DLL von Drittanbietern benötigt, ist tatsächlich ein Nachteil. Dies hängt von einem undokumentierten, Windows-internen Zweig der Visual C-Laufzeit ab. MinGW tut dies, weil die GPL-Systembibliotheksausnahme für gilt
msvcrt.dll
, was bedeutet, dass GPL-ed-Programme mit MinGW kompiliert und neu verteilt werden können.Aufgrund seiner viel breiteren und tieferen Unterstützung für POSIX im Vergleich zu
msvcrt.dll
ist Cygwin bei weitem die überlegene Umgebung für die Portierung von POSIX-Programmen. Da es jetzt unter der LGPL steht, können Anwendungen mit allen Arten von Lizenzen, Open oder Closed Source, neu verteilt werden. Cygwin enthält sogar VT100-Emulation undtermios
, die mit der Microsoft-Konsole funktionieren! Eine POSIX-Anwendung, die den Raw-Modus mittcsetattr
VT100-Codes einrichtet und zur Steuerung des Cursors verwendet, funktioniert direkt imcmd.exe
Fenster. Für den Endbenutzer handelt es sich um eine native Konsolen-App, die Win32-Aufrufe zur Steuerung der Konsole ausführt.Jedoch:
/bin/sh
und andere Probleme. Diese Unterschiede machen Cygwin-Programme "nicht nativ". Wenn ein Programm einen Pfad als Argument verwendet oder über ein Dialogfeld eingibt, erwarten Windows-Benutzer, dass dieser Pfad genauso funktioniert wie in anderen Windows-Programmen. Wenn es so nicht funktioniert, ist das ein Problem.Plug: Kurz nach der LGPL-Ankündigung habe ich das Cygnal- Projekt (Cygwin Native Application Library) gestartet, um einen Zweig der Cygwin-DLL bereitzustellen, mit dem diese Probleme behoben werden sollen . Programme können unter Cygwin entwickelt und dann mit der Cygnal-Version von
cygwin1.dll
ohne erneutes Kompilieren bereitgestellt werden . Wenn sich diese Bibliothek verbessert, wird MinGW nach und nach überflüssig.Wenn Cygnal das Problem der Pfadbehandlung löst, kann eine einzelne ausführbare Datei entwickelt werden, die mit Windows-Pfaden funktioniert, wenn sie als Windows-Anwendung mit Cygnal ausgeliefert wird, und nahtlos mit Cygwin-Pfaden funktioniert, wenn sie
/usr/bin
unter Cygwin installiert ist . Unter Cygwin arbeitet die ausführbare Datei transparent mit einem Pfad wie/cygdrive/c/Users/bob
. In der nativen Bereitstellung, in der eine Verknüpfung mit der Cygnal-Version von hergestellt wirdcygwin1.dll
, ist dieser Pfad nicht sinnvoll, während er verstanden wirdc:foo.txt
.quelle
Wikipedia sagt :
quelle
apt-cyg
da es vielleicht sogar einfacher ist als apt unter WSL.Übersehen Sie nicht die U / Win- Software von AT & T , mit der Sie Unix-Anwendungen unter Windows kompilieren können (letzte Version - 06.08.2012; verwendet Eclipse Public License, Version 1.0).
Wie Cygwin müssen sie gegen eine Bibliothek laufen; in ihrem Fall
POSIX.DLL
. Die AT & T-Leute sind großartige Ingenieure (dieselbe Gruppe, die Ihnen Ksh und Dot gebracht hat ) und ihre Sachen sind einen Besuch wert.quelle
Andere Antworten treffen bereits das Ziel. Ich möchte nur eine Illustration für einen schnellen Fang hinzufügen.
quelle
Cygwin emuliert die gesamte POSIX-Umgebung, während MinGW nur ein minimales Toolset für die Kompilierung ist (kompiliert native Win-Anwendungen). Wenn Sie also Ihr Projekt plattformübergreifend gestalten möchten, liegt die Wahl zwischen beiden auf der Hand, MinGW.
Obwohl Sie möglicherweise VS unter Windows, GCC unter Linux / Unices verwenden möchten. Die meisten Open Source-Projekte tun dies (z. B. Firefox oder Python).
quelle
clang
um eine praktikable plattformübergreifende Lösung handelt.Beachten Sie, dass das Verhalten des Dienstprogramms zwischen den beiden wirklich variieren kann.
Zum Beispiel kann Cygwin tar fork - da fork () in der DLL unterstützt wird - wo die mingw-Version dies nicht kann. Dies ist ein Problem beim Versuch, MySQL aus dem Quellcode zu kompilieren.
quelle
Um Cygwin in einer kommerziellen / proprietären / nicht Open-Source-Anwendung zu verwenden, müssen Sie Zehntausende von Dollar für einen " Lizenzkauf " von Red Hat ausgeben. Dies macht die Standardlizenzbedingungen mit erheblichen Kosten ungültig . Google "Cygwin Lizenzkosten" und sehen die ersten Ergebnisse.
Für mingw fallen keine derartigen Kosten an, und die Lizenzen (PD, BSD, MIT) sind äußerst zulässig. Es kann höchstens erwartet werden, dass Sie mit Ihrer Anwendung Lizenzdetails angeben, z. B. die Winpthreads-Lizenz, die für die Verwendung von mingw64-tdm erforderlich ist.
BEARBEITEN dank Izzy Helianthus: Die kommerzielle Lizenz ist nicht mehr verfügbar oder erforderlich, da die API-Bibliothek im Winsup-Unterverzeichnis von Cygwin im Gegensatz zur vollständigen GPL jetzt unter der LGPL verteilt wird .
quelle
Cygwin wurde entwickelt, um eine mehr oder weniger vollständige POSIX-Umgebung für Windows bereitzustellen, einschließlich einer umfangreichen Reihe von Tools, die eine vollwertige Linux-ähnliche Plattform bieten sollen. Im Vergleich dazu bieten MinGW und MSYS eine leichte, minimalistische POSIX-ähnliche Schicht mit nur den wichtigeren Tools wie
gcc
undbash
verfügbar. Aufgrund des minimalistischeren Ansatzes von MinGW bietet es nicht den Grad der POSIX-API-Abdeckung, den Cygwin bietet, und kann daher bestimmte Programme nicht erstellen, die ansonsten auf Cygwin kompiliert werden können.In Bezug auf den von beiden generierten Code basiert die Cygwin-Toolchain auf einer dynamischen Verknüpfung mit einer großen Laufzeitbibliothek
cygwin1.dll
, während die MinGW-Toolchain Code zu Binärdateien kompiliert, die dynamisch mit der nativen Windows C-Bibliothekmsvcrt.dll
sowie statisch mit Teilen von verknüpft sindglibc
. Ausführbare Cygwin-Dateien sind daher kompakter, erfordern jedoch eine separate weiterverteilbare DLL, während MinGW-Binärdateien eigenständig ausgeliefert werden können, jedoch tendenziell größer sind.Die Tatsache, dass Cygwin-basierte Programme eine separate DLL benötigen, führt ebenfalls zu Lizenzbeschränkungen. Die Cygwin-Laufzeitbibliothek ist unter GPLv3 lizenziert, mit einer Verknüpfungsausnahme für Anwendungen mit OSI-kompatiblen Lizenzen. Entwickler, die eine Closed-Source-Anwendung für Cygwin erstellen möchten, müssen daher eine kommerzielle Lizenz von Red Hat erwerben. Andererseits kann MinGW-Code sowohl in Open-Source- als auch in Closed-Source-Anwendungen verwendet werden, da die Header und Bibliotheken zulässig lizenziert sind.
quelle
Cygwin ist eine Unix-ähnliche Umgebung und Befehlszeilenschnittstelle für Microsoft Windows.
Mingw ist ein nativer Software-Port der GNU Compiler Collection (GCC) für Microsoft Windows, zusammen mit einer Reihe frei verteilbarer Importbibliotheken und Header-Dateien für die Windows-API. Mit MinGW können Entwickler native Microsoft Windows-Anwendungen erstellen.
Sie können mit
mingw
dercygwin
Umgebung generierte Binärdateien ausführen , sofern alle erforderlichen Bibliotheken (DLLs) vorhanden sind.quelle
Cygwin
verwendet eine Kompatibilitätsebene, während sieMinGW
nativ ist. Das ist einer der Hauptunterschiede.quelle