Was ist der Unterschied zwischen Cygwin und MinGW?

653

Ich möchte mein C ++ - Projekt plattformübergreifend gestalten und erwäge die Verwendung von Cygwin / MinGW. Aber was ist der Unterschied zwischen ihnen?

Eine andere Frage ist, ob ich die Binärdatei auf einem System ohne Cygwin / MinGW ausführen kann.

Łukasz Lew
quelle

Antworten:

624

Zur Vereinfachung ist es so:

  • Kompilieren Sie etwas in Cygwin und Sie kompilieren es für Cygwin .

  • Kompilieren Sie etwas in MinGW und Sie kompilieren es für Windows .

Ü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.

thomasrutter
quelle
42
Die mit MinGW gelieferte Bash ist kein natives Windows-Programm. Dies hängt von der MSYS-DLL ab, die ein Zweig der Cygwin-DLL ist. Gleiches gilt für viele andere Unix-Dienstprogramme, die mit MinGW / MSYS geliefert werden. MinGW gcc ist in der Tat ein natives Programm. Make ist sowohl in einer nativen als auch in einer MSYS-Version verfügbar.
Ak2
5
Unterschiede in der Geschwindigkeit?
EKanadily
5
Der Geschwindigkeitsunterschied ist in den meisten Situationen nicht zu erkennen. Jeder Unterschied hängt davon ab, um wie viel die zusätzliche Abstraktionsebene, die von der Cygwin-Kompatibilitätsschicht bereitgestellt wird, die Dinge verlangsamt. Dies kann messbare Auswirkungen auf Dinge wie E / A haben. Zum Beispiel lief Git vor langer Zeit nur unter Windows in Cygwin, und aus diesem Grund war es ziemlich viel langsamer. Wenn Sie jedoch mit einem Framework codieren, ist dies auch eine Abstraktionsschicht, die ohnehin einige Dinge verlangsamen kann.
Thomasrutter
27
Ich sollte beachten, dass für Cygwin kompilierter Code immer noch nativer Code ist - er muss nicht über einen Interpreter wie Java ausgeführt werden. Es ist nur so, dass es, wenn es mit bestimmten Betriebssystemfunktionen wie Festplatte / Datei interagieren muss, eine andere Ebene durchläuft.
Thomasrutter
3
Im Allgemeinen könnten Sie nicht vergleichen, da Sie Ihren Code unterschiedlich schreiben müssen, je nachdem, ob es sich um Cygwin handelt oder nicht. Obwohl für jede kleine, einfache Software wie "Hallo Welt" das Cygwin-Äquivalent nur aufgrund der Cygwin-Laufzeitbibliothek größer ist. Wenn Sie die Größe der Cygwin-Laufzeitbibliothek nicht zählen, ist die Cygwin-Version normalerweise kleiner, aber das ist meiner Meinung nach eine falsche Zahl, da die Bibliothek praktisch immer mit der Software geliefert werden muss. Das heißt, wenn Sie nicht triviale Bibliotheken / Frameworks verwenden, hängt dies mehr davon ab.
Thomasrutter
310

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.

Cole Johnson
quelle
59
Aber wenn ich kostenlose Nicht-GPL-Software veröffentlichen möchte? Entschuldigung, ich bin kein GPL-Fan, ist alles.
19
@Dan Sie müssen die von MinGW verwendete Laufzeit nicht neu verteilen - sie ist Teil von Windows.
14
@ ak2: das ist wahr, aber irreführend. In der Umgebung von cygwyn gcc + cygwin werden standardmäßig Binärdateien erstellt, die mit der (GPL) cygwin-DLL verknüpft sind. mingw + msys erzeugt standardmäßig Binärdateien, die mit der Plattform C lib verknüpft sind.
Sean McMillan
4
@DanMoulding Wenn Sie kein Microsoft-Fan sind, müssen Sie diese Gefühle ignorieren, um sich für Windows zu entwickeln. ;-)
Arda Xi
14
@anon "Aber wenn ich kostenlose Nicht-GPL-Software veröffentlichen möchte?" .. cygwin hat eine spezielle Ausnahme in seinen Lizenzbedingungen, die es Ihnen ermöglicht, damit verknüpfte freie Software unter anderen (Nicht-GPL) Open-Source-Lizenzen zu vertreiben. Siehe "Open Source Licensing Exception" hier: cygwin.com/licensing.html
Cook
138

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.

TrayMan
quelle
31
Dies funktioniert mit cygwin 1.7.6 nicht mehr. gcc: Das Flag -mno-cygwin wurde entfernt. Verwenden Sie einen mingw-bezogenen Cross-Compiler.
Sigjuice
2
@sigjuice: wahr, aber die alte -mno-cygwin-Flagge funktioniert immer noch für GCC 3.x:gcc-3 -mno-cygwin
Amro
1
Bedeutet dies also, dass ich die Mingw-Bibliotheken von der offiziellen Website von Mingw herunterladen muss, um sie von einem Cygwin-Host zu einem Mingw-Ziel zu kompilieren? Oder können diese Bibliotheken vom Cygwin-Paketsystem heruntergeladen werden?
CMCDragonkai
5
@CMCDragonkai Sie können mingw-kompatible Compiler von der Cygwin-Site erwerben, indem Sie das Setup-Dienstprogramm ausführen und sie suchen und ankreuzen. Obwohl gcc keinen mingw-kompatiblen Code mehr generiert, können Sie in Cygwin einen "mingw-gcc" (das ist nicht der vollständige Name) ausführen, um dieselbe Art von ausführbarer Datei zu erstellen, die der mingw-Compiler unter msys ausführen würde.
Cardiff Space Man
9
Um die hilfreiche Antwort von cardiff zu ändern, haben Cygwins MinGW-Pakete und -Befehle etwas unklare Namen. Installieren Sie das mingw64-x86_64-gcc-coreCygwin-Paket, um MinGW-64 zu installieren (so ziemlich das, was Sie heutzutage immer wollen ) . MinGW-64 wird dann als ungeschickt benannter x86_64-w64-mingw32-gccBefehl verfügbar sein . Bitte Gott (e), jemand vereint bereits die Namen dieser blutigen Dinge.
Cecil Curry
60

Wikipedia hat einen Vergleich hier .

Von Cygwins Website :

  • Cygwin ist eine Linux-ähnliche Umgebung für Windows. Es besteht aus zwei Teilen: Eine DLL (cygwin1.dll), die als Linux-API-Emulationsschicht fungiert und umfangreiche Linux-API-Funktionen bietet.
  • Eine Sammlung von Tools, die Linux-Look & Feel bieten.

Von Mingws Website :

MinGW ("Minimalistic GNU for Windows") ist eine Sammlung frei verfügbarer und frei verteilbarer Windows-spezifischer Header-Dateien und Importbibliotheken in Kombination mit GNU-Toolsets, mit denen native Windows-Programme erstellt werden können, die nicht auf C-Laufzeit-DLLs von Drittanbietern basieren

dirkgently
quelle
47

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.

Michael Burr
quelle
42

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.

Antwort 1: Schreiben Sie Ihren Quellcode in JAVA. Kompilieren Sie den Quellcode einmal und führen Sie ihn überall aus.


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…).

Antwort 2: Schreiben Sie Ihren Quellcode in C oder C ++. Verwenden Sie nur Standard-Header-Dateien. Verwenden Sie für jede Plattform einen geeigneten Compiler (z. B. Visual Studio für Windows, GCC für Linux und XCode für Mac). Beachten Sie, dass Sie keine erweiterten Programmierfunktionen verwenden sollten, um Ihren Quellcode auf allen Plattformen erfolgreich zu kompilieren. Wenn Sie keine C- oder C ++ - Standardklassen oder -funktionen verwenden, wird Ihr Quellcode auf anderen Plattformen nicht kompiliert.


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?

Antwort 3: Ja, verwenden Sie den GCC-Compiler. Es ist ein plattformübergreifender Compiler. Um Ihren Quellcode in Windows zu kompilieren , verwenden Sie MinGW , das den GCC-Compiler für Windows bereitstellt und Ihren Quellcode in ein natives Windows-Programm kompiliert. Verwenden Sie keine erweiterten Programmierfunktionen (wie die Windows-API), um Ihren Quellcode auf allen Plattformen erfolgreich zu kompilieren. Wenn Sie Windows-API-Funktionen verwenden, wird Ihr Quellcode auf anderen Plattformen nicht kompiliert.


Frage 4: C- oder C ++ - Standardheaderdateien bieten keine erweiterten Programmierfunktionen wie Multithreading. Was kann ich machen?

Antwort 4: Sie sollten den POSIX-Standard (Portable Operating System Interface [für UNIX]) verwenden. Es bietet viele erweiterte Programmierfunktionen und -werkzeuge. Viele Betriebssysteme ganz oder teilweise POSIX-kompatibel (wie Mac OS X, Solaris, BSD / OS und ...). Einige Betriebssysteme sind zwar nicht offiziell als POSIX-kompatibel zertifiziert, entsprechen jedoch größtenteils (wie Linux, FreeBSD, OpenSolaris und ...). Cygwin bietet eine weitgehend POSIX-kompatible Entwicklungs- und Laufzeitumgebung für Microsoft Windows.


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.

Amir Saniyan
quelle
4
Über Ihre kleine FAQ: 1) Ihr Recht, wenn Sie etwas brauchen, das irgendwo läuft und nicht kompiliert werden muss, wählen Sie etwas wie Java (vergessen Sie auch nicht Python, Perl, Ruby und den Rest der Skriptsprachen) 2) Dies ist für den Fall von C etwas falsch, da alle Compiler von C dies sehr gut unterstützen. 3) Sie können die Win32-API weiterhin verwenden, müssen sie jedoch in eine Portabilitätsebene einbinden, sodass dies nur ein Entwurfsproblem darstellt.
Coyote21
1
4) Dies ist aus den oben genannten Gründen völlig falsch, da POSIX nur eine andere API ist. Auch wenn Sie so viel POSIX verteidigen, sollten Sie wissen, dass selbst Unices nicht denselben POSIX-Satz implementieren müssen, also wie beschäftigst du dich damit Die Echtzeit-POSIX-API fällt mir ein. Und das lässt Sie völlig falsch und falsch schließen, da Sie für nichts in Windows POSIX benötigen. Sie können einfach die Win32-API verwenden. Oder wie haben Qt, GTK und WxWidgets Ihrer Meinung nach einen Weg gefunden, plattformübergreifend zu sein? Ich denke, dass alle Cygwin in Windows verwenden müssen. -1 Stimme für deine Antwort.
Coyote21
4
Ich verstehe dein Argument nicht, @ Coyote21. Wollen Sie damit sagen, dass POSIX für die plattformübergreifende Entwicklung ungeeignet ist? Wollen Sie damit sagen, dass der einzig geeignete Weg, Code in C / C ++ für mehrere Plattformen zu schreiben, darin besteht, für jede Plattform, die Sie unterstützen möchten, eine eigene Kompatibilitätsebene zu schreiben? Ich sehe nichts falsches an dem Vorschlag, mit POSIX zu beginnen. Sie müssen sehen, wie weit es Sie bringen kann und ob eine umfassende Kompatibilitätsschichtlösung erforderlich ist. Große Kompatibilitätsschichten sind nicht die Norm. Anders zu sagen bedeutet zu argumentieren, dass POSIX ein vollständiger Fehler ist.
David Gladfelter
Multithreading wird über die POSIX-Schicht auch in MinGW implementiert.
Alexander Shishenko
1
"Sie sollten keine erweiterten Programmierfunktionen verwenden, um Ihren Quellcode auf allen Plattformen erfolgreich zu kompilieren." Sie müssen wirklich klarstellen, was Sie unter "erweiterten Programmierfunktionen" verstanden haben. Basierend auf einer späteren Zeile meine ich, dass Sie tatsächlich plattformspezifische Funktionen meinen . Wenn Sie moderne Sprachfunktionen gemeint haben, dann nein, denn es gibt kompetente Compiler für "alle [Haupt-] Plattformen", und wir sollten uns nicht der Funktionen berauben, nur um diejenigen zu unterstützen, deren Compiler oder Bibliotheken immer noch zurückbleiben. Mit einem anständigen Compiler, Standard C / ++ und plattformübergreifende Bibliotheken, können wir sein viel fortgeschritten.
underscore_d
33

Unter dem Gesichtspunkt der Portierung eines C-Programms können Sie dies am besten anhand eines Beispiels verstehen:

#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;
}

Wenn wir ändern statzu_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.dllHier nnbefindet sich ein Versionssuffix. Um dieses Programm zu versenden, müssen wir diese DLL einschließen. Das DLL stellt _stat, systemundprintf . (Wir haben auch die Möglichkeit, die Laufzeit statisch zu verknüpfen.)

Unter MinGW wird das Programm mit msvcrt.dlleiner 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:

  • Die statFunktion gibt nur sehr begrenzte Informationen zurück, z. B. keine nützlichen Berechtigungen oder Inode-Nummern.
  • Der Pfad c:file.txtwird gemäß dem aktuellen Arbeitsverzeichnis aufgelöst, das dem Laufwerk zugeordnet ist c:.
  • systemwird cmd.exe /czum 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) und cyggcc_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:

  • Die statFunktion verfügt über umfangreiche Funktionen und gibt in den meisten Feldern aussagekräftige Werte zurück.
  • Der Pfad c:file.txtenthält überhaupt keine Laufwerksbuchstabenreferenz, da c: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.
  • Die systemFunktion versucht, den /bin/sh -cInterpreter zu verwenden. Cygwin löst den /Pfad entsprechend dem Speicherort Ihrer ausführbaren Datei auf und erwartet, dass sich ein sh.exeProgramm zusammen mit Ihrer ausführbaren Datei befindet.

Sowohl Cygwin als auch MinGW ermöglichen die Verwendung von Win32-Funktionen. Wenn Sie anrufen möchten MessageBoxoder CreateProcess, können Sie dies tun. Sie können gcc -mwindowsunter 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.dlloder die wiederverteilbaren msvcrtnn.dllLaufzeiten enthalten sind). Ein Beispiel hierfür sind die spawn*Funktionsfamilien wie spawnvp. Diese sind eine gute Idee anstelle von forkund execauf Cygwin, da sie besser auf das Windows-Modell zur Prozesserstellung abgebildet werden, für das es kein Konzept gibt fork.

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.dllist 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 und termios, die mit der Microsoft-Konsole funktionieren! Eine POSIX-Anwendung, die den Raw-Modus mit tcsetattrVT100-Codes einrichtet und zur Steuerung des Cursors verwendet, funktioniert direkt im cmd.exeFenster. Für den Endbenutzer handelt es sich um eine native Konsolen-App, die Win32-Aufrufe zur Steuerung der Konsole ausführt.

Jedoch:

  • Als natives Windows-Entwicklungstool weist Cygwin einige Besonderheiten auf, z. B. die für Windows fremde Pfadbehandlung, die Abhängigkeit von einigen fest codierten Pfaden wie /bin/shund 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.dllohne 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/binunter 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 wird cygwin1.dll, ist dieser Pfad nicht sinnvoll, während er verstanden wird c:foo.txt.

Kaz
quelle
2
Hervorragende Antwort. Es ist wichtig zu zeigen, was passiert, wenn derselbe Code in jeder der drei Umgebungen kompiliert, verknüpft und ausgeführt wird, und die Unterschiede zu verdeutlichen.
Drlolly
@Kaz Wie läuft diese Entwicklung? Klingt iteresting, aber es scheint seit mindestens einem Jahr tot zu sein. Warum benutzt du nicht GitHub, damit die Leute helfen und teilnehmen können?
not2qubit
2
@ not2qubit Ich habe das Gefühl, dass ich meine Projekte besser kontrollieren kann, wenn sie auf meinem eigenen Server gehostet werden, den ich selbst kontrolliere. Ich benutze Git; Das Repository kann abgerufen werden. Ich kann Pull-Anfragen per E-Mail annehmen (wie Linus Torvalds sie entworfen hat). Ich kann auch jemandem ein Konto mit Festschreibungsberechtigungen geben, der ein Mitarbeiter auf Wartungsebene wird. Cygnal funktioniert gut; Ich bündle es regelmäßig in den Windows-Versionen neuer Versionen der TXR-Sprache. Ich werde Cygnal irgendwann Anfang 2019 auf eine neuere Cygwin-Basislinie zurücksetzen.
Kaz
@ not2qubit Beachten Sie, dass alle 17 Themen in der Cygnal-Agenda wie angesprochen sind. Niemand hat neue Anforderungen vorgeschlagen oder sich über den Umgang mit diesen 17 beschwert. Es ist also keine andere Entwicklung erforderlich, als auf das neuere Cygwin umzusteigen, was nicht sehr dringend ist.
Kaz
27

Wikipedia sagt :

MinGWgegabelt von Version 1.3.3 von Cygwin. Obwohl beide Cygwin und MinGWkönnen zum Portieren verwendet werdenUNIX Software Windows, haben sie unterschiedliche Ansätze: CygwinZiele eine vollständige bereitzustellen , POSIX layer die Emulationen von mehreren Systemaufrufe und Bibliotheken bereitstellt , die auf existieren Linux, UNIXund die BSDVarianten. Das POSIX layer läuft darüber hinaus Windowsund beeinträchtigt die Leistung, wenn dies für die Kompatibilität erforderlich ist. Dementsprechend erfordert dieser Ansatz, dass WindowsProgramme, mit denen geschrieben wurde Cygwin, auf einer Copylefted-Kompatibilitätsbibliothek ausgeführt werden, die zusammen mit den Programmen mit dem Programm verteilt werden muss source code. MinGWzielt darauf ab, native Funktionalität und Leistung über direkt bereitzustellen Windows API calls. Im Gegensatz zu Cygwin,MinGWerfordert keine Kompatibilitätsschicht DLLund daher müssen Programme nicht mit verteilt werden source code.

Weil MinGWes abhängig ist Windows API calls, kann es kein volles liefern POSIX API; Einige UNIX applications, mit denen kompiliert werden kann, können nicht kompiliert werden Cygwin. Dies gilt insbesondere für Anwendungen, die POSIXFunktionen erfordern , wie z fork().mmap() oderioctl() voraussichtlich in a ausgeführt werden POSIX environment. Geschrieben Anwendungen , die eine Verwendung , cross-platform librarydie sich auf portiert wurde MinGW, wie SDL, wxWidgets, Qtoder GTK+wird in der Regel so leicht in kompilieren , MinGWwie sie es in Cygwin.

Die Kombination aus MinGWund MSYSbietet eine kleine, eigenständige Umgebung, die auf Wechselmedien geladen werden kann, ohne dass Einträge in der Registrierung oder Dateien auf dem Computer verbleiben. CygwinPortable bietet eine ähnliche Funktion. Durch die Bereitstellung von mehr Funktionen Cygwin wird die Installation und Wartung komplizierter.

Es ist auch möglich cross-compile Windows applicationsmit MinGW-GCC under POSIX systems. Dies bedeutet, dass Entwickler keine Windows-Installation mit benötigenMSYS , um Software zu kompilieren, die Windowsohne ausgeführt wird Cygwin.

PersianGulf
quelle
2
Es ist definitiv nicht "komplizierter zu installieren und zu warten" ! Verwenden Sie es, apt-cygda es vielleicht sogar einfacher ist als apt unter WSL.
not2qubit
14

Ü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.

Norman Ramsey
quelle
4
Wow, das sind einige schlechte Webseiten. Ich konnte endlich einen Download-Link unter www2.research.att.com/sw/download finden , aber keine Online-Dokumentation oder Informationen zum Projekt.
Fantius
1
Obwohl die Informationen nützlich sind, denke ich, dass dies eher die Antwort auf eine Frage zu Alternativen für MingW oder Cygwin als auf diese Frage sein könnte.
Vivek
12

Andere Antworten treffen bereits das Ziel. Ich möchte nur eine Illustration für einen schnellen Fang hinzufügen.

Geben Sie hier die Bildbeschreibung ein

smwikipedia
quelle
11

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).

vartec
quelle
"Most" scheint hier ein bedeutungsloses Wieselwort zu sein, insbesondere mit nur 2 Beispielen und ohne Statistik. Viele FOSS-Projekte werfen eine VS-Projektdatei als Token-Geste ein, ich vermute, sie ist genauer. Wenn jedoch Erfahrungen aus der Vergangenheit vorliegen, sind GCC oder Clang in der Regel sicherer, da VS im Zuge der Weiterentwicklung der Sprachstandards tendenziell erheblich zurückbleibt.
underscore_d
Das ist eine Antwort aus dem Jahr 2009. Heutzutage sieht es für GCC noch düsterer aus. Was "die meisten" betrifft, wenn Sie anhand der Auswirkungen messen, haben nur Firefox und Chrome allein mehr Benutzer als alles andere.
Vartec
2
Was sich seit meiner Antwort geändert hat, ist, dass es sich jetzt clangum eine praktikable plattformübergreifende Lösung handelt.
Vartec
9

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
Aus diesem Grund bieten vollwertige MinGW-fähige Umgebungen, z. B. MSYS2, einen Cygwin oder eine andere vollständig POSIX-kompatible Schicht für die während des Baus benötigten einfachen Schrauben und Muttern von Werkzeugketten. Dann bleibt die eigentliche Kompilierung und Verknüpfung dem vollständig nativen MinGW-Compiler überlassen. MSYS2 ist wirklich ordentlich.
underscore_d
9

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 .

Ingenieur
quelle
2
Ein Update von der Redhat-Website (der Link von "License Buyout" - 'Ab dem 1. März 2016 verkauft Red Hat die kommerzielle Buyout-Lizenz für Cygwin nicht mehr. Die kommerzielle Lizenz ist nicht mehr erforderlich, da Cygwin jetzt unter dem GNU Lesser vertrieben wird GPL (LGPL). '> Von der Cygwin-Website. Die Cygwin ™ -API-Bibliothek im Winsup-Unterverzeichnis des Quellcodes wird durch die GNU Lesser General Public License (LGPL) Version 3 oder höher abgedeckt. Einzelheiten zu den Anforderungen von LGPLv3, Bitte lesen Sie die GNU Lesser General Public License (LGPL).
Izzy Helianthus
6

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 gccundbash 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-Bibliothek msvcrt.dllsowie statisch mit Teilen von verknüpft sind glibc. 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.

bwDraco
quelle
3

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 mingwder cygwinUmgebung generierte Binärdateien ausführen , sofern alle erforderlichen Bibliotheken (DLLs) vorhanden sind.

gimel
quelle
1

Cygwinverwendet eine Kompatibilitätsebene, während sie MinGWnativ ist. Das ist einer der Hauptunterschiede.

user3362761
quelle