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 das Binary auf einem System ohne Cygwin/MinGW ausführen kann?
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 das Binary auf einem System ohne Cygwin/MinGW ausführen kann?
Vereinfacht gesagt, sieht das so aus:
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
Cygwin ist eine Kompatibilitätsschicht, die es einfach macht, einfache Unix-basierte Anwendungen auf Windows zu portieren, indem sie viele der grundlegenden Schnittstellen emuliert, die Unix-basierte Betriebssysteme zur Verfügung stellen, wie z.B. Pipes, Datei- und Verzeichniszugriff im Unix-Stil und so weiter, wie in der POSIX Normen. Wenn Sie bereits über Quellcode verfügen, der diese Schnittstellen verwendet, können Sie ihn möglicherweise mit wenigen oder gar keinen Änderungen für die Verwendung mit Cygwin kompilieren, was den Prozess der Portierung von einfachem IO-basiertem Unix-Code für die Verwendung unter Windows erheblich vereinfacht.
Wenn Sie Ihre Software weitergeben, muss der Empfänger sie zusammen mit der Cygwin-Laufzeitumgebung ausführen (die in der Datei cygwin1.dll
). Sie können dies mit Ihrer Software weitergeben, aber Ihre Software muss der Open-Source-Lizenz entsprechen. Selbst wenn Sie Ihre Software nur damit verknüpfen, die DLL aber separat weitergeben, können Ihrem Code Lizenzbeschränkungen auferlegt werden.
Über MinGW
MinGW zielt darauf ab, einfach eine Portierung der GNU-Entwicklungswerkzeuge für Windows zu sein. Es versucht nicht, Unix zu emulieren oder umfassende Kompatibilität mit Unix zu bieten, sondern eine Version der GNU Compiler Collection, der GNU Binutils und des GNU Debuggers bereitzustellen, die nativ unter Windows verwendet werden kann. Es enthält auch Header-Dateien, die die Verwendung der nativen API von Windows in Ihrem Code ermöglichen.
Daher muss Ihre Anwendung speziell für Windows programmiert werden und die Windows-API verwenden, was erhebliche Änderungen bedeuten kann, wenn sie für die Ausführung in einer Standard-Unix-Umgebung erstellt wurde und Unix-spezifische Funktionen verwendet. Standardmäßig wird Code, der mit MinGW's GCC kompiliert wurde, zu einem nativen Windows X86-Ziel kompiliert, einschließlich .exe- und .dll-Dateien, obwohl Sie mit den richtigen Einstellungen auch cross-kompilieren können, da Sie im Grunde die GNU-Compiler-Tool-Suite verwenden.
MinGW ist eine freie und quelloffene Alternative zur Verwendung des Microsoft Visual C++ Compiler und die zugehörigen Linking/Make-Tools unter Windows. In einigen Fällen kann es möglich sein, mit MinGW etwas zu kompilieren, das für die Kompilierung mit Microsoft Visual C++ vorgesehen war, ohne allzu viele Änderungen vorzunehmen.
Obwohl MingW einige Headerdateien und Schnittstellencode enthält, die es Ihrem Code ermöglichen, mit der Windows-API zu interagieren, werden dadurch, wie bei den regulären Standardbibliotheken, keine Lizenzbeschränkungen für die von Ihnen erstellte Software auferlegt.
Andere Überlegungen
Für jede nicht-triviale Softwareanwendung, wie z.B. eine, die eine grafische Oberfläche verwendet, Multimedia oder auf Geräte im System zugreift, verlassen Sie die Grenze dessen, was Cygwin für Sie tun kann, und es wird weitere Arbeit nötig sein, um Ihren Code plattformübergreifend zu machen. Diese Aufgabe kann jedoch durch die Verwendung von plattformübergreifenden Toolkits oder Frameworks vereinfacht werden, die es ermöglichen, einmal zu kodieren und Ihren Code für jede Plattform erfolgreich zu kompilieren. Wenn Sie von Anfang an ein solches Framework verwenden, können Sie nicht nur Ihre Kopfschmerzen reduzieren, wenn es an der Zeit ist, auf eine andere Plattform zu portieren, sondern Sie können auch dieselben grafischen Widgets - Fenster, Menüs und Steuerelemente - auf allen Plattformen verwenden, wenn Sie eine GUI-Anwendung schreiben, und sie für den Benutzer nativ erscheinen lassen.
Zum Beispiel ist die Open-Source Qt-Framework ist ein beliebtes und umfassendes plattformübergreifendes Entwicklungs-Framework, das die Erstellung von grafischen Anwendungen ermöglicht, die auf allen Betriebssystemen, einschließlich Windows, funktionieren. Es gibt auch andere derartige Frameworks. Zusätzlich zu den großen Frameworks gibt es Tausende von spezialisierten Softwarebibliotheken, die mehrere Plattformen unterstützen, so dass Sie sich weniger Gedanken über das Schreiben von unterschiedlichem Code für verschiedene Plattformen machen müssen.
Wenn Sie von Anfang an plattformübergreifende Software entwickeln, haben Sie normalerweise keinen Grund, Cygwin zu verwenden. Wenn Sie unter Windows kompilieren, werden Sie in der Regel darauf abzielen, dass Ihr Code entweder mit MingW oder Microsoft Visual C/C++ oder mit beiden kompiliert werden kann. Bei der Kompilierung unter Linux/*nix werden Sie den Code meist direkt mit den GNU-Compilern und -Tools kompilieren.
Die Bash, die mit MinGW geliefert wird, ist kein natives Windows-Programm. Sie hängt von der MSYS-DLL ab, die ein Fork der Cygwin-DLL ist. Dasselbe gilt für viele der anderen Unix-Dienstprogramme, die mit MinGW/MSYS mitgeliefert werden. MinGW gcc ist allerdings ein natives Programm. Make ist sowohl in einer nativen Version als auch in einer MSYS-Version verfügbar.
Der Geschwindigkeitsunterschied ist in den folgenden Fällen nicht erkennbar Die meisten Situationen. Jeder Unterschied wird davon abhängen, wie sehr die zusätzliche Abstraktionsebene, die die Cygwin-Kompatibilitätsschicht bietet, die Dinge verlangsamt. Es kann eine messbare Auswirkung auf Dinge wie E/A haben. Zum Beispiel, vor langer Zeit, Git lief nur unter Windows in cygwin, und war deshalb etwas langsamer. Andererseits, wenn man mit einem Framework programmiert, ist das auch eine Abstraktionsschicht mit dem Potenzial, einige Dinge zu verlangsamen.
Cygwin ist ein Versuch, eine vollständige UNIX/POSIX-Umgebung unter Windows zu schaffen. Zu diesem Zweck verwendet es verschiedene DLLs. Während diese DLLs unter die GPLv3+ fallen, enthält ihre Lizenz eine Ausnahme die ein abgeleitetes Werk nicht dazu zwingt, unter die GPLv3+ zu fallen. MinGW ist eine C/C++-Compiler-Suite, die es Ihnen ermöglicht, ausführbare Windows-Dateien ohne Abhängigkeit von solchen DLLs zu erstellen - Sie benötigen nur die normalen MSVC-Laufzeiten, die Teil jeder normalen Microsoft Windows-Installation sind.
Sie können auch eine kleine UNIX/POSIX-ähnliche Umgebung erhalten, die mit MinGW kompiliert wurde. MSYS . Es hat nicht annähernd alle Funktionen von Cygwin, ist aber ideal für Programmierer, die MinGW verwenden wollen.
Aber wenn ich freie Nicht-GPL-Software veröffentlichen möchte? Tut mir leid, ich bin kein GPL-Fan, das ist alles.
@Dan Die Laufzeitumgebung, die MinGW verwendet, muss nicht neu verteilt werden - sie ist Teil von Windows.
Dies funktioniert nicht mehr mit cygwin 1.7.6. gcc: Das -mno-cygwin Flag wurde entfernt; verwenden Sie einen mingw-ausgerichteten Cross-Compiler.
@sigjuice: Stimmt, aber das alte -mno-cygwin Flag funktioniert noch für GCC 3.x: gcc-3 -mno-cygwin
Bedeutet dies also, dass ich die Mingw-Bibliotheken von der offiziellen Website von Mingw herunterladen muss, um ein Mingw-Ziel von einem Cygwin-Host zu kompilieren? Oder können diese Bibliotheken von Cygwins Paketsystem heruntergeladen werden?
Wikipedia macht einen Vergleich hier .
Von Cygwins Website :
- Cygwin ist eine Linux-ähnliche Umgebung für Windows. Sie besteht aus zwei Teilen: Eine DLL (cygwin1.dll), die als Linux-API-Emulationsschicht fungiert und umfangreiche Linux-API-Funktionen bietet.
- Eine Sammlung von Werkzeugen, die ein Linux-Look-and-Feel bieten.
Von Mingw's Website :
MinGW ("Minimalistic GNU for Windows") ist eine Sammlung frei verfügbarer und frei verteilbarer Windows-spezifischer Header-Dateien und Import-Bibliotheken in Kombination mit GNU-Toolsets, die es erlauben, native Windows-Programme zu erstellen, die nicht auf C-Laufzeit-DLLs von Drittanbietern angewiesen sind.
Die Website von MinGW-w64 lautet jetzt . Es heißt: "Mingw-w64 ist eine Weiterentwicklung des ursprünglichen mingw.org-Projekts, das zur Unterstützung des GCC-Compilers auf Windows-Systemen entwickelt wurde. Es hat sich 2007 gegabelt, um Unterstützung für 64 Bit und neue APIs zu bieten. Seitdem hat es eine weite Verbreitung und Verwendung gefunden.
Cygwin verwendet eine DLL, cygwin.dll, (oder vielleicht eine Reihe von DLLs), um eine POSIX-ähnliche Laufzeit unter Windows zu ermöglichen.
MinGW kompiliert zu einer nativen Win32-Anwendung.
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 Laufzeitumgebung.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Sie können einrichten, dass MinGW zusammen mit Ihrem Paket installiert wird. Obwohl ich keinen akzeptierten Arbeitsablauf dafür anbieten kann (daher keine Antwort vielleicht kann jemand anderes etwas hinzufügen), bin ich mir sicher, dass es mehr als möglich ist, da Git dies für die Git Bash tut. Schauen Sie sich den Fensternamen für git bash auf jedem Windows-System an.