Wat is het verschil tussen Cygwin en MinGW?

Ik wil mijn C++-project platformoverschrijdend maken en overweeg Cygwin/MinGW te gebruiken.
Maar wat is het verschil tussen hen?

Een andere vraag is of ik het binaire bestand kan uitvoeren op een systeem zonder Cygwin/MinGW?


Antwoord 1, autoriteit 100%

Ter vereenvoudiging is het als volgt:

  • Compileer iets in Cygwin en je compileert het voor Cygwin.

  • Compileer iets in MinGW en je compileert het voor Windows.

Over Cygwin

Cygwin is een compatibiliteitslaag die het gemakkelijk maakt om eenvoudige Unix-gebaseerde applicaties naar Windows te porten, door veel van de basisinterfaces te emuleren die Unix-gebaseerde besturingssystemen bieden, zoals pipes, Unix-stijl bestands- en directorytoegang, en enzovoort, zoals gedocumenteerd door de POSIX-normen. Als je bestaande broncode hebt die deze interfaces gebruikt, kun je deze mogelijk compileren voor gebruik met Cygwin nadat je weinig of zelfs geen wijzigingen hebt aangebracht, wat het proces van het overzetten van eenvoudige op IO gebaseerde Unix-code voor gebruik op Windows aanzienlijk vereenvoudigt.

Wanneer u uw software distribueert, moet de ontvanger deze samen met de Cygwin runtime-omgeving uitvoeren (geleverd door het bestand cygwin1.dll). U mag dit samen met uw software distribueren, maar uw software zal moeten voldoen aan de open source-licentie ervan. Zelfs het koppelen van uw software eraan, maar het apart distribueren van de dll, kan nog steeds licentiebeperkingen opleggen aan uw code.

Over MinGW

MinGW wil gewoon een port zijn van GNU’s ontwikkelingstools voor Windows. Het probeert niet te emuleren of uitgebreide compatibiliteit met Unix te bieden, behalve dat het een versie van de GNU Compiler Collection, GNU Binutils en GNU Debugger biedt die native in Windows kan worden gebruikt. Het bevat ook header-bestanden die het gebruik van de eigen API van Windows in uw code mogelijk maken.

Als gevolg hiervan moet uw toepassing specifiek voor Windows worden geprogrammeerd met behulp van de Windows API, wat een aanzienlijke wijziging kan betekenen als deze is gemaakt om te kunnen draaien in een standaard Unix-omgeving en om Unix-specifieke functies te gebruiken. Standaard wordt code die is gecompileerd in MinGW’s GCC gecompileerd naar een native Windows X86-doel, inclusief .exe- en .dll-bestanden, hoewel u ook kunt cross-compileren met de juiste instellingen, aangezien u in feite de GNU-compilertoolsuite gebruikt.

MinGW is een gratis en open source alternatief voor het gebruik van Microsoft Visual C++compiler en de bijbehorende koppelings-/make-tools op Windows. Het kan in sommige gevallen mogelijk zijn om MinGW te gebruiken om iets te compileren dat bedoeld was om te compileren met Microsoft Visual C++ zonder al te veel aanpassingen.

Hoewel MingW enkele headerbestanden en interfacecode bevat waarmee uw code kan communiceren met de Windows API, legt dit, net als bij de reguliere standaardbibliotheken, geen licentiebeperkingen op voor software die u heeft gemaakt.

Andere overwegingen

Voor elke niet-triviale softwaretoepassing, zoals een die gebruikmaakt van een grafische interface, multimedia of toegang heeft tot apparaten op het systeem, verlaat u de grens van wat Cygwin voor u kan doen en is er meer werk nodig om uw code te laten kruisen -platform. Maar deze taak kan worden vereenvoudigd door gebruik te maken van platformonafhankelijke toolkits of frameworks waarmee u één keer codeert en uw code met succes voor elk platform laat compileren. Als u vanaf het begin een dergelijk framework gebruikt, kunt u niet alleen uw hoofdpijn verminderen als het tijd is om naar een ander platform te porten, maar kunt u dezelfde grafische widgets gebruiken – vensters, menu’s en bedieningselementen – op alle platforms als u een GUI-app en laat ze native lijken voor de gebruiker.

Het open source Qt-frameworkis bijvoorbeeld een populair en uitgebreid cross- platformontwikkelingsraamwerk, waarmee grafische toepassingen kunnen worden gebouwd die werken op verschillende besturingssystemen, inclusief Windows. Er zijn ook andere dergelijke kaders. Naast de grote frameworks zijn er duizenden meer gespecialiseerde softwarebibliotheken die meerdere platforms ondersteunen, zodat u zich minder zorgen hoeft te maken over het schrijven van verschillende code voor verschillende platforms.

Als u vanaf het begin platformonafhankelijke software ontwikkelt, heeft u normaal gesproken geen enkele reden om Cygwin te gebruiken. Als je de code op Windows compileert, zou je er normaal gesproken naar streven om je code te compileren met MingW of Microsoft Visual C/C++, of beide. Bij het compileren op Linux/*nix, compileer je het meestal rechtstreeks met de GNU-compilers en tools.


Antwoord 2, autoriteit 48%

Cygwin is een poging om een volledige UNIX/POSIX-omgeving op Windows te creëren. Hiervoor gebruikt het verschillende DLL’s. Hoewel deze DLL’s onder GPLv3+ vallen, bevat hun licentie een uitzonderingdie niet dwingt om een afgeleid werk te dekken door de GPLv3+. MinGW is een C/C++-compilersuite waarmee u Windows-uitvoerbare bestanden kunt maken zonder afhankelijk te zijn van dergelijke DLL’s – u hebt alleen de normale MSVC-runtimes nodig, die deel uitmaken van elke normale Microsoft Windows-installatie.

Je kunt ook een kleine UNIX/POSIX-achtige omgeving krijgen, gecompileerd met MinGW genaamd MSYS. Het heeft lang niet alle functies van Cygwin, maar is ideaal voor programmeurs die MinGW willen gebruiken.


Antwoord 3, autoriteit 21%

Om aan de andere antwoorden toe te voegen, Cygwin wordt geleverd met de MinGW-bibliotheken en headers en je kunt compileren zonder te linken naar de cygwin1.dll door de vlag -mno-cygwin te gebruiken met gcc. Ik geef hier de voorkeur aan boven het gebruik van gewone MinGW en MSYS.


Antwoord 4, autoriteit 9%

Wikipedia vergelijkt hier.

Van Cygwin’s website:

  • Cygwin is een Linux-achtige omgeving voor Windows. Het bestaat uit twee delen: een DLL (cygwin1.dll) die fungeert als een Linux API-emulatielaag die substantiële Linux API-functionaliteit biedt.
  • Een verzameling tools die een Linux-look en feel bieden.

Van Mingw’s website:

MinGW (“Minimalistische GNU voor Windows”) is een verzameling vrij beschikbare en vrij te distribueren Windows-specifieke header-bestanden en importbibliotheken gecombineerd met GNU-toolsets waarmee men native Windows-programma’s kan maken die niet afhankelijk zijn van C van derden runtime-DLL’s


Antwoord 5, autoriteit 7%

Cygwin gebruikt een DLL, cygwin.dll (of misschien een set DLL’s) om een POSIX-achtige runtime op Windows te bieden.

MinGW compileert naar een native Win32-toepassing.

Als u iets met Cygwin bouwt, heeft elk systeem waarop u het installeert ook de Cygwin-DLL(‘s) nodig. Een MinGW-applicatie heeft geen speciale runtime nodig.


Antwoord 6, autoriteit 6%

Lees deze beantwoorde vragen om het verschil tussen Cygwin en MinGW te begrijpen.


Vraag #1: Ik wil een applicatie maken waarbij ik de broncode één keer schrijf, deze één keer compileer en op elk platform laat draaien (bijv. Windows, Linux en Mac OS X…).

Antwoord #1: Schrijf uw broncode in
JAVA. Compileer de broncode één keer en
voer het overal uit.


Vraag #2: Ik wil een applicatie maken waarbij ik de broncode eenmalig schrijf, maar het is geen probleem dat ik de broncode voor elk platform afzonderlijk compileer (bijv. Windows, Linux en Mac OS X …).

Antwoord #2: Schrijf je broncode in C
of C++. Gebruik standaard header-bestanden
enkel en alleen. Gebruik een geschikte compiler voor elke
platform (bijv. Visual Studio voor)
Windows, GCC voor Linux en XCode voor
Mac). Merk op dat u er geen mag gebruiken
geavanceerde programmeerfuncties om
compileer je broncode in totaal
platformen succesvol. Als je gebruikt
geen C of C++ standaardklassen of
functies, uw broncode niet
compileren op andere platforms.


Vraag #3: In antwoord op vraag #2 is het moeilijk om voor elk platform een andere compiler te gebruiken, is er een cross-platform compiler?

Antwoord #3: Ja, gebruik de GCC-compiler. Het
is een cross-platform compiler. Tot
compileer uw broncode in Windows
gebruik MinGWdat GCC-compiler levert
voor Windows en compileert uw bron
code naar het native Windows-programma. Niet doen
gebruik alle geavanceerde programmeerfuncties
(zoals Windows API) om uw . te compileren
broncode op alle platforms
met succes. Als u Windows API gebruikt
functies, uw broncode niet
compileren op andere platforms.


Vraag #4: C- of C++ standaard headerbestanden bieden geen geavanceerde programmeerfuncties zoals multi-threading. Wat kan ik doen?

Antwoord #4: U moet POSIX gebruiken
(Draagbare besturingssysteeminterface)
[voor UNIX]) standaard. Het biedt veel
geavanceerde programmeerfuncties en
gereedschap. Veel besturingssystemen volledig of
gedeeltelijk POSIX-compatibel (zoals Mac OS
X, Solaris, BSD/OS en …). Sommige
besturingssystemen, hoewel niet officieel
gecertificeerd als POSIX-compatibel, conform
voor een groot deel (zoals Linux, FreeBSD,
OpenSolaris en …). Cygwinbiedt
een grotendeels POSIX-conforme ontwikkeling
en runtime-omgeving voor Microsoft
Windows.


Dus:

Gebruik MinGW om gebruik te maken van GCC cross-platform compiler in Windows.

Gebruik Cygwin om gebruik te maken van de standaard geavanceerde programmeerfuncties en tools van POSIX in Windows.


Antwoord 7, autoriteit 6%

Vanuit het oogpunt van het overzetten van een C-programma, is een goede manier om dit te begrijpen een voorbeeld te nemen:

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

Als we statveranderen in _stat, kunnen we dit programma compileren met Microsoft Visual C. We kunnen dit programma ook compileren met MinGW en met Cygwin.

Onder Microsoft Visual C wordt het programma gekoppeld aan een MSVC herdistribueerbare runtime-bibliotheek: mxvcrtnn.dll, waarbij nneen versieachtervoegsel is. Om dit programma te verzenden, moeten we die DLL toevoegen. Die DLL biedt _stat, systemen printf. (We hebben ook de mogelijkheid om de runtime statisch te koppelen.)

Onder MinGW wordt het programma gekoppeld aan msvcrt.dll, wat een interne, niet-gedocumenteerde, versieloze bibliotheek is die deel uitmaakt van Windows, en verboden is voor gebruik van applicaties. Die bibliotheek is in wezen een afsplitsing van de herdistribueerbare runtime-bibliotheek van MS Visual C voor gebruik door Windows zelf.

Onder beide zal het programma vergelijkbaar gedrag vertonen:

  • de functie statretourneert zeer beperkte informatie, bijvoorbeeld geen bruikbare machtigingen of inodenummer.
  • het pad c:file.txtwordt opgelost volgens de huidige werkmap die is gekoppeld aan station c:.
  • systemgebruikt cmd.exe /cvoor het uitvoeren van de externe opdracht.

We kunnen het programma ook compileren onder Cygwin. Net als de herdistribueerbare runtime die wordt gebruikt door MS Visual C, zal het Cygwin-programma worden gekoppeld aan de runtime-bibliotheken van Cygwin: cygwin1.dll(eigenlijke Cygwin) en cyggcc_s-1.dll(GCC runtime-ondersteuning). Aangezien Cygwin nu onder de LGPL valt, kunnen we het programma met ons programma verpakken, zelfs als het geen GPL-compatibele gratis software is, en het programma verzenden.

Onder Cygwin gedragen de bibliotheekfuncties zich anders:

  • de functie statheeft uitgebreide functionaliteit en levert in de meeste velden betekenisvolle waarden op.
  • het pad c:file.txtwordt helemaal niet opgevat als een verwijzing naar een stationsletter, aangezien c:niet wordt gevolgd door een schuine streep. De dubbele punt wordt beschouwd als onderdeel van de naam en is er op de een of andere manier in verminkt. Er is geen concept van een relatief pad tegen een volume of schijf in Cygwin, geen concept “momenteel gelogde schijf” en geen huidige werkmap per schijf.
  • de functie systemprobeert de interpreter /bin/sh -cte gebruiken. Cygwin zal het /-pad oplossen op basis van de locatie van uw uitvoerbare bestand, en verwachten dat een sh.exe-programma samen met uw uitvoerbaar bestand wordt geplaatst.

Zowel Cygwin als MinGW stellen je in staat om Win32-functies te gebruiken. Als u MessageBoxof CreateProcesswilt aanroepen, kunt u dat doen. Je kunt ook gemakkelijk een programma bouwen waarvoor geen consolevenster nodig is, met behulp van gcc -mwindows, onder MinGW en Cygwin.

Cygwin is niet strikt POSIX. Naast toegang tot de Windows API, biedt het ook zijn eigen implementaties van sommige Microsoft C-functies (dingen te vinden in msvcrt.dllof de herdistribueerbare msvcrtnn.dlllooptijden). Een voorbeeld hiervan is de spawn*familie van functies zoals spawnvp. Deze zijn een goed idee om te gebruiken in plaats van forken execop Cygwin, omdat ze beter overeenkomen met het Windows-procescreatiemodel dat geen concept van fork.

Dus:

  • Cygwin-programma’s zijn niet minder “native” dan MS Visual C-programma’s omdat ze de begeleiding van bibliotheken vereisen. Van programmeertaalimplementaties op Windows wordt verwacht dat ze hun eigen runtime bieden, zelfs C-taalimplementaties. Er is geen “libc” op Windows voor openbaar gebruik.

  • Het feit dat MinGW geen DLL van derden vereist, is eigenlijk een nadeel; het is afhankelijk van een ongedocumenteerde, Windows-interne vork van de Visual C-runtime. MinGW doet dit omdat de uitzondering voor de GPL-systeembibliotheek van toepassing is op msvcrt.dll, wat betekent dat GPL-ed programma’s kunnen worden gecompileerd en opnieuw gedistribueerd met MinGW.

  • Vanwege de veel bredere en diepere ondersteuning voor POSIX in vergelijking met msvcrt.dll, is Cygwin verreweg de superieure omgeving voor het overzetten van POSIX-programma’s. Omdat het nu onder de LGPL valt, kunnen applicaties met allerlei licenties, open of gesloten source, opnieuw worden gedistribueerd. Cygwin bevat zelfs VT100-emulatie en termios, die werken met de Microsoft-console! Een POSIX-toepassing die de onbewerkte modus instelt met tcsetattren VT100-codes gebruikt om de cursor te besturen, werkt rechtstreeks in het venster cmd.exe. Wat de eindgebruiker betreft, is het een native console-app die Win32-aanroepen doet om de console te bedienen.

Echter:

  • Als native Windows-ontwikkeltool heeft Cygwin enkele eigenaardigheden, zoals padafhandeling die vreemd is aan Windows, afhankelijkheid van sommige hardgecodeerde paden zoals /bin/shen andere problemen. Deze verschillen maken Cygwin-programma’s “niet-native”. Als een programma een pad als argument gebruikt, of invoer vanuit een dialoogvenster, verwachten Windows-gebruikers dat dat pad op dezelfde manier werkt als in andere Windows-programma’s. Als het niet zo werkt, is dat een probleem.

Plug:kort na de aankondiging van de LGPL begon ik de Cygnal( Cygwin Native Application Library) project om een fork van de Cygwin DLL te leveren die tot doel heeft deze problemen op te lossen. Programma’s kunnen onder Cygwin worden ontwikkeld en vervolgens worden ingezet met de Cygnal-versie van cygwin1.dllzonder opnieuw te compileren. Naarmate deze bibliotheek verbetert, zal de noodzaak voor MinGW geleidelijk verdwijnen.

Als Cygnal het padafhandelingsprobleem oplost, zal het mogelijk zijn om een enkel uitvoerbaar bestand te ontwikkelen dat werkt met Windows-paden wanneer het wordt geleverd als een Windows-toepassing met Cygnal, en naadloos samenwerkt met Cygwin-paden wanneer het is geïnstalleerd in uw /usr/binonder Cygwin. Onder Cygwin zal het uitvoerbare bestand transparant werken met een pad zoals /cygdrive/c/Users/bob. In de native implementatie waar het linkt naar de Cygnal-versie van cygwin1.dll, heeft dat pad geen zin, terwijl het c:foo.txtwel begrijpt.


Antwoord 8, autoriteit 4%

Andere antwoorden hebben het doel al bereikt. Ik wil gewoon een illustratie toevoegen voor een snelle vangst.


Antwoord 9, autoriteit 2%

Kijk niet over de AT&T’s U/Win-software, die is ontworpen om u te helpen bij het compileren van Unix-toepassingen op Windows (laatste versie – 06-08-2012; gebruikt Eclipse Public License, versie 1.0).

Net als Cygwin moeten ze het opnemen tegen een bibliotheek; in hun geval POSIX.DLL. De AT&T-mannen zijn geweldige ingenieurs (dezelfde groep die je ksh en dotbracht) en hun werk is het bekijken waard.


Antwoord 10, autoriteit 2%

Cygwin emuleert de volledige POSIX-omgeving, terwijl MinGW een minimale toolset is voor alleen compilatie (compileert native Win-applicatie.) Dus als u uw project platformonafhankelijk wilt maken, ligt de keuze tussen de twee voor de hand, MinGW.

Hoewel je zou kunnen overwegen om VS op Windows te gebruiken, GCC op Linux/Unices. De meeste open source-projecten doen dat (bijvoorbeeld Firefox of Python).


Antwoord 11

Om Cygwin te gebruiken in een niet-vrije/proprietary/closed-source applicatie, moet je tienduizenden dollars uitgeven voor een “licentie-buy-out” van Red Hat; dit maakt de standaard licentievoorwaardenongeldig tegen aanzienlijke kosten. Google “cygwin-licentiekosten” en bekijk de eerste paar resultaten.

Voor mingw worden dergelijke kosten niet gemaakt en de licenties (PD, BSD, MIT) zijn extreem tolerant. Er mag maximaal mogelijkvan u worden verwacht dat u licentiegegevens bij uw aanvraag verstrekt, zoals de winpthreads-licentie die vereist is bij het gebruik van mingw64-tdm.

BEWERKEN dankzij Izzy Helianthus:de commerciële licentie is niet langer beschikbaar of nodig omdat de API-bibliotheek te vinden is in de winsup-subdirectory van Cygwin wordt nu gedistribueerdonder de LGPL, in tegenstelling tot de volledige GPL.


Antwoord 12

Merk op dat het gedrag van hulpprogramma’s echt kan variëren tussen de twee.

Bijvoorbeeld, Cygwin tar kan fork – omdat fork() wordt ondersteund in de DLL – waar de mingw-versie dat niet kan. Dit is een probleem bij het compileren van mysql vanaf de broncode.


Antwoord 13

Cygwin is ontworpen om een min of meer complete POSIX-omgeving voor Windows te bieden, inclusief een uitgebreide set tools die zijn ontworpen om een volwaardig Linux-achtig platform te bieden. Ter vergelijking: MinGW en MSYS bieden een lichtgewicht, minimalistische POSIX-achtige laag, met alleen de meer essentiële tools zoals gccen bashbeschikbaar. Vanwege MinGW’s meer minimalistische benadering, biedt het niet de mate van POSIX API-dekking die Cygwin biedt, en kan daarom bepaalde programma’s niet bouwen die anders op Cygwin kunnen worden gecompileerd.

In termen van de code die door de twee wordt gegenereerd, vertrouwt de Cygwin-toolchain op dynamische koppeling naar een grote runtime-bibliotheek, cygwin1.dll, terwijl de MinGW-toolchain code compileert naar binaire bestanden die dynamisch linken naar de Windows native C-bibliotheek msvcrt.dllen statisch naar delen van glibc. Cygwin-uitvoerbare bestanden zijn daarom compacter, maar vereisen een aparte herdistribueerbare DLL, terwijl MinGW-binaire bestanden stand-alone kunnen worden verzonden, maar meestal groter zijn.

Het feit dat op Cygwin gebaseerde programma’s een aparte DLL nodig hebben om te worden uitgevoerd, leidt ook tot licentiebeperkingen. De Cygwin runtime-bibliotheek is gelicentieerd onder GPLv3 met een koppelingsuitzondering voor applicaties met OSI-compatibele licenties, dus ontwikkelaars die een closed-source applicatie rond Cygwin willen bouwen, moeten een commerciële licentie van Red Hat aanschaffen. Aan de andere kant kan MinGW-code worden gebruikt in zowel open-source als closed-source toepassingen, aangezien de headers en bibliotheken een permissieve licentie hebben.


Antwoord 14

Cygwinis een Unix-achtige omgeving en opdrachtregelinterface voor Microsoft Windows.

Mingwis een native softwareport van de GNU Compiler Collection (GCC) naar Microsoft Windows , samen met een set vrij te distribueren importbibliotheken en headerbestanden voor de Windows API. Met MinGW kunnen ontwikkelaars native Microsoft Windows-applicaties maken.

U kunt binaire bestanden uitvoeren die zijn gegenereerd met MinGWzonder de Cygwin-omgeving, op voorwaarde dat alle benodigde bibliotheken (DLL’s) aanwezig zijn.


Antwoord 15

Cygwingebruikt een compatibiliteitslaag, terwijl MinGWnative is. Dat is een van de belangrijkste verschillen.


Antwoord 16

  MinGW (or MinGW-w64)               Cygwin
   --------------------               ------
   Your program written        Your program written
  for Unix and GNU/Linux      for Unix and GNU/Linux
             |                           |
             |                           |
             V                           V
    Heavy modifications       Almost no modifications
             |                           |
             |                           |
             V                           V
        Compilation                 Compilation
Program compiled with Cygwin ---> Compatibility layer ---> Windows API
Program compiled with MinGW (or MingGW-w64) -------------> Windows API

Other episodes