Qual è la differenza tra Cygwin e MinGW?


658

Voglio rendere il mio progetto C ++ multipiattaforma e sto pensando di utilizzare Cygwin / MinGW. Ma qual è la differenza tra loro?

Un'altra domanda è se sarò in grado di eseguire il binario su un sistema senza Cygwin / MinGW?

Risposte:


629

Come semplificazione, è così:

  • Compila qualcosa in Cygwin e lo stai compilando per Cygwin .

  • Compila qualcosa in MinGW e lo stai compilando per Windows .

Informazioni su Cygwin

Lo scopo di Cygwin è rendere molto più semplice il porting di applicazioni basate su Unix su Windows, emulando molti dei piccoli dettagli forniti dai sistemi operativi basati su Unix e sono documentati dagli standard POSIX . L'applicazione può utilizzare la funzionalità Unix come pipe, accesso ai file e alla directory in stile Unix e così via, e può essere compilata con Cygwin che fungerà da strato di compatibilità attorno all'applicazione, in modo che molti di quei paradigmi specifici di Unix possano continua ad essere usato.

Quando si distribuisce il software, il destinatario dovrà eseguirlo insieme all'ambiente di runtime Cygwin (fornito dal file cygwin1.dll). Puoi distribuire questo con il tuo software, ma il tuo software dovrà essere conforme alla sua licenza open source. Potrebbe anche essere il caso che anche solo il collegamento del software con esso, ma la distribuzione della DLL separatamente, possa comunque richiedere di onorare la licenza open source.

Informazioni su MinGW

MinGW mira semplicemente a essere una porta Windows degli strumenti del compilatore GNU, come GCC, Make, Bash e così via. Non tenta di emulare o fornire una completa compatibilità con Unix, ma fornisce invece l'ambiente minimo necessario per utilizzare GCC (il compilatore GNU) e un piccolo numero di altri strumenti su Windows. Non ha un livello di emulazione Unix come Cygwin, ma di conseguenza la tua applicazione deve essere specificamente programmata per poter funzionare in Windows, il che può significare un'alterazione significativa se è stata creata per fare affidamento sull'esecuzione in un ambiente Unix standard e utilizza funzionalità specifiche di Unix come quelle menzionate in precedenza. Per impostazione predefinita, il codice compilato nel GCC di MinGW verrà compilato su una destinazione Windows X86 nativa, inclusi i file .exe e .dll, anche se potresti anche eseguire la compilazione incrociata con le giuste impostazioni, dal momento che stai fondamentalmente usando la suite di strumenti del compilatore GNU.

MinGW è essenzialmente un'alternativa al compilatore Microsoft Visual C ++ e ai relativi strumenti di collegamento / creazione. In alcuni casi potrebbe essere possibile utilizzare MinGW per compilare qualcosa che era destinato alla compilazione con Microsoft Visual C ++, con le librerie giuste e in alcuni casi con altre modifiche.

MinGW include alcune librerie standard di base per l'interazione con il sistema operativo Windows, ma come con le normali librerie standard incluse nella raccolta di compilatori GNU, queste non impongono restrizioni di licenza sul software creato.

Per applicazioni software non banali, renderle multipiattaforma può essere una sfida considerevole a meno che non si utilizzi un framework multipiattaforma completo. Al momento in cui ho scritto questo, il framework Qt era uno dei più popolari a questo scopo, consentendo la creazione di applicazioni grafiche che funzionano su sistemi operativi tra cui Windows, ma ci sono anche altre opzioni. Se utilizzi un tale framework dall'inizio, non solo puoi ridurre il mal di testa quando arriva il momento di port su un'altra piattaforma, ma puoi utilizzare gli stessi widget grafici - finestre, menu e controlli - su tutte le piattaforme se stai scrivendo un App GUI e farli apparire nativi per l'utente.


43
Il bash fornito con MinGW non è un programma Windows nativo. Dipende dalla DLL MSYS, che è un fork della DLL Cygwin. Lo stesso vale per molte altre utility Unix fornite con MinGW / MSYS. MinGW gcc è davvero un programma nativo però. Make è disponibile sia in una versione nativa che in una MSYS.
ak2

6
eventuali differenze in termini di velocità?
EKanadily,

6
La differenza di velocità sarà ignorabile nella maggior parte delle situazioni. Qualsiasi differenza dipenderà da quanto il livello aggiuntivo di astrazione fornito dallo strato di compatibilità di Cygwin rallenta le cose. Potrebbe avere un effetto misurabile su cose come l'I / O. Ad esempio, molto tempo fa, Git funzionava solo su Windows in Cygwin, e per questo era un po 'più lento. Inoltre, se si codifica utilizzando un framework, si tratta anche di un livello di astrazione con il potenziale di rallentare comunque alcune cose.
thomasrutter,

28
Dovrei notare che il codice compilato per cygwin è ancora un codice nativo - non ha bisogno di passare attraverso un interprete come dire Java. È solo che quando deve interagire con determinate funzionalità del sistema operativo come disco / file passa attraverso un altro livello.
thomasrutter,

4
A livello generale non saresti in grado di confrontare, perché devi scrivere il tuo codice in modo diverso a seconda che sia per Cygwin o meno. Sebbene per qualsiasi software piccolo e semplice come "ciao mondo" l'equivalente di Cygwin sarà più grande solo a causa della libreria di runtime di Cygwin. Se non si contano le dimensioni della libreria di runtime di Cygwin, la versione di Cygwin sarà di solito più piccola, ma questa è una cifra falsa, penso che la libreria dovrà praticamente sempre essere fornita con il software. Detto questo, se stai usando librerie / framework non banali, dipenderà più da questo.
thomasrutter,

311

Cygwin è un tentativo di creare un ambiente UNIX / POSIX completo su Windows. Per fare ciò utilizza varie DLL. Mentre queste DLL sono coperte da GPLv3 +, la loro licenza contiene un'eccezione che non impone che un'opera derivata sia coperta da GPLv3 +. MinGW è una suite di compilatori C / C ++ che consente di creare file eseguibili di Windows senza dipendenza da tali DLL - sono necessari solo i normali runtime MSVC, che fanno parte di qualsiasi normale installazione di Microsoft Windows.

Puoi anche ottenere un piccolo ambiente UNIX / POSIX, compilato con MinGW chiamato MSYS . Non ha nulla vicino a tutte le funzionalità di Cygwin, ma è l'ideale per i programmatori che desiderano utilizzare MinGW.


59
Ma se voglio rilasciare software gratuito non GPL? Scusa, non sono un fan di GPL, tutto qui.

19
@Dan Non è necessario ridistribuire il runtime utilizzato da MinGW: fa parte di Windows.

14
@ ak2: è vero, ma fuorviante. cygwyn gcc + cygwin ambiente per impostazione predefinita produce binari collegati alla dll cygwin (GPL). Per impostazione predefinita, mingw + msys produce binari collegati alla piattaforma C lib.
Sean McMillan,

4
@DanMoulding Se non sei un fan di Microsoft, dovrai prima ignorare questi sentimenti per sviluppare per Windows. ;-)
Arda Xi,

14
@anon "Ma se voglio rilasciare software gratuito non GPL?" .. cygwin ha un'eccezione speciale nei termini di licenziamento che consente di distribuire software libero collegato ad esso con altre licenze open source (non GPL). Vedi "Eccezione delle licenze Open Source" qui: cygwin.com/licensing.html
steve cook

138

Per aggiungere alle altre risposte, Cygwin viene fornito con le librerie e le intestazioni MinGW ed è possibile compilare senza collegarsi a cygwin1.dll utilizzando -mno-cygwin flag con gcc. Preferisco di gran lunga questo all'utilizzo di MinGW e MSYS.


31
Questo non funziona più con cygwin 1.7.6. gcc: il flag -mno-cygwin è stato rimosso; usa un cross-compilatore mirato a mingw.
sigjuice,

2
@sigjuice: vero, ma la vecchia bandiera -mno-cygwin funziona ancora per GCC 3.x:gcc-3 -mno-cygwin
Amro

1
Quindi questo significa che devo scaricare le librerie mingw dal sito ufficiale di mingw per compilare un target mingw da un host cygwin? Oppure queste librerie possono essere scaricate dal sistema di pacchetti di Cygwin?
CMCDragonkai,

5
@CMCDragonkai È possibile acquisire compilatori compatibili mingw dal sito Cygwin eseguendo l'utility di installazione e trovandoli e spuntandoli. Quindi anche se gcc non genera più codice compatibile con mingw, all'interno di Cygwin è possibile eseguire un "mingw-gcc" (che non è il nome completo) per creare lo stesso tipo di eseguibile che il compilatore mingw eseguirà sotto msys.
cardiff space man

9
Per modificare la risposta utile di cardiff, i pacchetti e i comandi MinGW di Cygwin hanno nomi piuttosto oscuri. Per installare MinGW-64 ( praticamente quello che vuoi sempre, oggigiorno ), installa il mingw64-x86_64-gcc-corepacchetto Cygwin. MinGW-64 sarà quindi disponibile come x86_64-w64-mingw32-gcccomando chiamato goffamente . Per favore Dio (i), qualcuno unifica già i nomi di queste cose insanguinate.
Cecil Curry,

60

Wikipedia fa un confronto qui .

Dal sito Web di Cygwin :

  • Cygwin è un ambiente simile a Linux per Windows. È costituito da due parti: una DLL (cygwin1.dll) che funge da strato di emulazione dell'API Linux che fornisce una sostanziale funzionalità dell'API Linux.
  • Una raccolta di strumenti che forniscono aspetto e funzionalità Linux.

Dal sito Web di Mingw :

MinGW ("Minimalistic GNU per Windows") è una raccolta di file di intestazione e librerie di importazione specifici per Windows liberamente disponibili e liberamente distribuibili combinati con set di strumenti GNU che consentono di produrre programmi Windows nativi che non si basano su DLL di runtime C di terze parti


47

Cygwin utilizza una DLL, cygwin.dll (o forse un insieme di DLL) per fornire un runtime simile a POSIX su Windows.

MinGW si compila in un'applicazione Win32 nativa.

Se si crea qualcosa con Cygwin, qualsiasi sistema su cui lo si installa avrà bisogno anche delle DLL di Cygwin. Un'applicazione MinGW non richiede alcun runtime speciale.


42

Leggi queste domande con risposta per capire la differenza tra Cygwin e MinGW.


Domanda n. 1: Voglio creare un'applicazione che scrivo una volta il codice sorgente, compilarlo una volta ed eseguirlo su qualsiasi piattaforma (ad esempio Windows, Linux e Mac OS X ...).

Risposta n. 1: Scrivi il codice sorgente in JAVA. Compilare il codice sorgente una volta ed eseguirlo ovunque.


Domanda n. 2: Voglio creare un'applicazione che scrivo il codice sorgente una volta ma non c'è alcun problema nel compilare il codice sorgente per qualsiasi piattaforma separatamente (ad es. Windows, Linux e Mac OS X ...).

Risposta n. 2: scrivi il codice sorgente in C o C ++. Utilizzare solo file di intestazione standard. Utilizzare un compilatore adatto per qualsiasi piattaforma (ad esempio Visual Studio per Windows, GCC per Linux e XCode per Mac). Si noti che non è necessario utilizzare alcuna funzionalità di programmazione avanzata per compilare correttamente il codice sorgente in tutte le piattaforme. Se non si utilizzano classi o funzioni standard C o C ++, il codice sorgente non viene compilato in altre piattaforme.


Domanda n. 3: in risposta alla domanda n. 2, è difficile utilizzare un compilatore diverso per ciascuna piattaforma, esiste un compilatore multipiattaforma?

Risposta 3: Sì, usa il compilatore GCC. È un compilatore multipiattaforma. Per compilare il codice sorgente in Windows, utilizzare MinGW che fornisce il compilatore GCC per Windows e compila il codice sorgente nel programma Windows nativo. Non utilizzare funzioni di programmazione avanzate (come l'API di Windows) per compilare correttamente il codice sorgente in tutte le piattaforme. Se si utilizzano le funzioni dell'API di Windows, il codice sorgente non viene compilato in altre piattaforme.


Domanda n. 4: i file di intestazione standard C o C ++ non forniscono alcuna funzionalità di programmazione avanzata come il multi-threading. Cosa posso fare?

Risposta n. 4: utilizzare lo standard POSIX (Portable Operating System Interface [per UNIX]). Fornisce molte funzioni e strumenti di programmazione avanzati. Molti sistemi operativi sono completamente o parzialmente compatibili con POSIX (come Mac OS X, Solaris, BSD / OS e ...). Alcuni sistemi operativi, sebbene non siano ufficialmente certificati come POSIX compatibili, sono conformi in gran parte (come Linux, FreeBSD, OpenSolaris e ...). Cygwin offre un ambiente di sviluppo e run-time ampiamente conforme a POSIX per Microsoft Windows.


Così:

Per sfruttare il vantaggio del compilatore multipiattaforma GCC in Windows, utilizzare MinGW.

Per sfruttare le funzionalità e gli strumenti di programmazione avanzata standard POSIX in Windows, utilizzare Cygwin.


4
Informazioni sulla tua piccola domanda: 1) Il tuo diritto, se hai bisogno di qualcosa che funzioni ovunque e non debba essere compilato, scegli qualcosa come java (inoltre non dimenticare python, perl, ruby ​​e il resto dei linguaggi di script) 2) Questo è in qualche modo sbagliato nel caso di C, poiché tutti i compilatori di C lo supportano molto bene. 3) Puoi ancora usare win32 api, ma devi avvolgerlo in un livello di portabilità, quindi questo è solo un problema di progettazione.
Coyote21,

1
4) Questo è totalmente sbagliato, a causa dei motivi che ho dato sopra, poiché POSIX è solo altri api, anche se difendi così tanto POSIX, dovresti sapere che anche gli Unices non hanno bisogno di implementare lo stesso set di POSIX, quindi come ti occupi di questo? Mi viene in mente l'API POSIX in tempo reale. E questo ti rende la conclusione completamente falsa e sbagliata, poiché non hai bisogno di POSIX per nulla in Windows, puoi semplicemente usare l'API Win32. O come pensi che Qt, GTK e WxWidgets abbiano trovato il modo di essere multipiattaforma, immagino che tutti debbano usare Cygwin in Windows. -1 voto per la tua risposta.
Coyote21,

4
Non capisco il tuo argomento, @ Coyote21. Stai dicendo che POSIX non è adatto allo sviluppo multipiattaforma? Stai dicendo che l'unico modo appropriato per scrivere codice in C / C ++ per più piattaforme è scrivere il tuo livello di compatibilità per ogni piattaforma che desideri supportare? Non vedo nulla di sbagliato nel suggerimento di iniziare con POSIX. È necessario vedere fino a che punto può arrivare e se sarà necessaria una soluzione di livello di compatibilità estesa. I grandi livelli di compatibilità non sono la norma. Dire altrimenti significa sostenere che POSIX è un fallimento completo.
David Gladfelter,

Il multithreading è implementato tramite il livello POSIX anche in MinGW.
Alexander Shishenko il

1
"non dovresti usare nessuna funzionalità di programmazione avanzata per compilare con successo il tuo codice sorgente su tutte le piattaforme." Devi davvero chiarire cosa intendevi per "funzionalità di programmazione avanzata". Sulla base di una riga successiva, suppongo che in realtà intendi funzionalità specifiche della piattaforma . Se intendevi funzionalità del linguaggio moderno, allora no, perché esistono compilatori competenti per "tutte le [principali] piattaforme" e non dovremmo privarci delle funzionalità solo per sostenere coloro i cui compilatori o librerie sono ancora in ritardo. Con un compilatore decente, C / ++ standard e librerie multipiattaforma, possiamo essere molto avanzati.
underscore_d

34

Dal punto di vista del porting di un programma C, un buon modo per capirlo è fare un esempio:

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

Se passiamo stata _stat, possiamo compilare questo programma con Microsoft Visual C. Possiamo anche compilare questo programma con MinGW e con Cygwin.

In Microsoft Visual C, il programma sarà collegato a una libreria di runtime ridistribuibile MSVC:, mxvcrtnn.dlldove nnè presente un suffisso di versione. Per spedire questo programma dovremo includere quella DLL. Che DLL fornisce _stat, systeme printf. (Abbiamo anche la possibilità di collegare staticamente il tempo di esecuzione.)

Sotto MinGW, il programma sarà collegato a msvcrt.dll, che è una libreria interna, non documentata, non documentata, che fa parte di Windows, e vietata all'uso dell'applicazione. Tale libreria è essenzialmente un fork della libreria di runtime ridistribuibile di MS Visual C per l'utilizzo da parte di Windows stesso.

In entrambi i casi, il programma avrà comportamenti simili:

  • la statfunzione restituirà informazioni molto limitate, ad esempio nessuna autorizzazione utile o numero di inode.
  • il percorso c:file.txtviene risolto in base alla directory di lavoro corrente associata all'unità c:.
  • systemutilizza cmd.exe /cper eseguire il comando esterno.

Possiamo anche compilare il programma sotto Cygwin. Analogamente al runtime ridistribuibile utilizzato da MS Visual C, il programma Cygwin sarà collegato alle librerie di runtime di Cygwin: cygwin1.dll(Cygwin corretto) e cyggcc_s-1.dll(supporto di runtime di GCC). Dato che Cygwin è ora sotto LGPL, possiamo creare pacchetti con il nostro programma, anche se non è un software gratuito compatibile con GPL, e spedire il programma.

Sotto Cygwin, le funzioni della libreria si comporteranno diversamente:

  • la statfunzione ha una ricca funzionalità, restituendo valori significativi nella maggior parte dei campi.
  • il percorso c:file.txtnon è affatto inteso come contenente un riferimento alla lettera di unità, poiché c:non è seguito da una barra. I due punti sono considerati parte del nome e in qualche modo vi sono stati ridotti. Non esiste un concetto di percorso relativo rispetto a un volume o unità in Cygwin, nessun concetto di "unità attualmente registrata" e nessuna directory di lavoro corrente per unità.
  • la systemfunzione tenta di usare l' /bin/sh -cinterprete. Cygwin risolverà il /percorso in base alla posizione del file eseguibile e si aspetterà che un sh.exeprogramma sia collocato insieme al file eseguibile.

Sia Cygwin che MinGW consentono di utilizzare le funzioni Win32. Se vuoi chiamare MessageBoxo CreateProcess, puoi farlo. Puoi anche creare facilmente un programma che non richiede una finestra della console, usando gcc -mwindowsMinGW e Cygwin.

Cygwin non è strettamente POSIX. Oltre a fornire accesso all'API di Windows, fornisce anche le proprie implementazioni di alcune funzioni di Microsoft C (elementi trovati msvcrt.dllo msvcrtnn.dllruntime ridistribuibili ). Un esempio di questo è la spawn*famiglia di funzioni come spawnvp. Si tratta di una buona idea da utilizzare al posto di forke execsu Cygwin poiché mappano meglio il modello di creazione del processo di Windows di cui non ha idea fork.

Così:

  • I programmi Cygwin non sono meno "nativi" dei programmi MS Visual C in quanto richiedono l'accompagnamento di librerie. Le implementazioni del linguaggio di programmazione su Windows dovrebbero fornire il proprio runtime, anche implementazioni del linguaggio C. Non esiste "libc" su Windows per uso pubblico.

  • Il fatto che MinGW non richieda DLL di terze parti è in realtà uno svantaggio; dipende da un fork interno di Windows non documentato del runtime di Visual C. MinGW lo fa perché si applica l'eccezione della libreria di sistema GPL msvcrt.dll, il che significa che i programmi GPL ed possono essere compilati e ridistribuiti con MinGW.

  • Grazie al suo supporto molto più ampio e profondo per POSIX rispetto a msvcrt.dll, Cygwin è di gran lunga l'ambiente superiore per il porting dei programmi POSIX. Dal momento che ora è sotto LGPL, consente di ridistribuire le applicazioni con tutti i tipi di licenze, aperte o chiuse. Cygwin contiene anche l'emulazione VT100 e termios, che funziona con la console Microsoft! Un'applicazione POSIX che imposta la modalità raw con tcsetattre utilizza i codici VT100 per controllare il cursore funzionerà proprio nella cmd.exefinestra. Per quanto riguarda l'utente finale, è un'app console nativa che effettua chiamate Win32 per controllare la console.

Però:

  • Come strumento di sviluppo nativo di Windows, Cygwin ha alcune stranezze, come la gestione dei percorsi che è estranea a Windows, la dipendenza da alcuni percorsi codificati come /bin/she altri problemi. Queste differenze sono ciò che rende i programmi Cygwin "non nativi". Se un programma utilizza un percorso come argomento o input da una finestra di dialogo, gli utenti Windows si aspettano che quel percorso funzioni allo stesso modo degli altri programmi Windows. Se non funziona in questo modo, questo è un problema.

Plug: Poco dopo l'annuncio della LGPL, ho avviato il progetto Cygnal (Cygwin Native Application Library) per fornire un fork della Cygwin DLL che mira a risolvere questi problemi. I programmi possono essere sviluppati sotto Cygwin e quindi distribuiti con la versione Cygnal cygwin1.dllsenza ricompilare. Man mano che questa libreria migliora, eliminerà gradualmente la necessità di MinGW.

Quando Cygnal risolve il problema di gestione dei percorsi, sarà possibile sviluppare un singolo eseguibile che funziona con i percorsi di Windows quando viene spedito come applicazione Windows con Cygnal e funziona perfettamente con i percorsi di Cygwin se installato /usr/binsu Cygwin. Sotto Cygwin, l'eseguibile funzionerà in modo trasparente con un percorso simile /cygdrive/c/Users/bob. Nella distribuzione nativa in cui si collega alla versione di Cygnal cygwin1.dll, quel percorso non avrà senso, mentre capirà c:foo.txt.


2
Risposta eccellente. Mostrare cosa succede quando lo stesso pezzo di codice viene compilato, collegato ed eseguito in ciascuno dei 3 ambienti è fondamentale e chiarisce le differenze.
drlolly,

@Kaz Come sta andando questo sviluppo? Sembra complicato ma sembra morto da almeno un anno. Perché non usi GitHub in modo che le persone possano aiutare e partecipare?
not2qubit il

2
@ not2qubit Sento di avere un migliore controllo sui miei progetti quando sono ospitati sul mio server che mi controllo. Sto usando git; il repository può essere estratto. Posso accettare richieste pull via e-mail (come le hanno progettate Linus Torvalds). Posso anche dare un account con privilegi di commit a qualcuno che diventa un collaboratore a livello di manutentore. Cygnal funziona bene; Lo impacco regolarmente nelle versioni di Windows delle nuove versioni del linguaggio TXR. Rinnoverò Cygnal con una nuova baseline Cygwin all'inizio del 2019.
Kaz

@ not2qubit Nota che tutte e 17 le questioni nell'agenda Cygnal sono come risolte. Nessuno ha suggerito nuovi requisiti o si è lamentato del modo in cui questi 17 vengono gestiti. quindi non è necessario altro sviluppo se non il rifacimento al nuovo Cygwin, che non è estremamente urgente.
Kaz,

27

Wikipedia dice :

MinGWbiforcuta dalla versione 1.3.3 di Cygwin. Sebbene entrambi Cygwin e MinGWpossono essere utilizzati per porto UNIXsoftware Windows, hanno approcci diversi: Cygwinmira a fornire un completo POSIX layer che fornisce emulazione di diverse chiamate di sistema e librerie esistenti su Linux, UNIXe le BSDvarianti. La POSIX layer corre in cima Windows, sacrificare le prestazioni, se necessario, per la compatibilità. Di conseguenza, questo approccio richiede che i Windowsprogrammi scritti con Cygwinvengano eseguiti su una libreria di compatibilità copyleft che deve essere distribuita con il programma, insieme a quella del programma source code. MinGWmira a fornire funzionalità e prestazioni native direttamente Windows API calls. A differenza Cygwin,MinGWnon richiede un livello di compatibilità DLLe quindi i programmi non devono essere distribuiti con source code.

Perché MinGWdipende da Windows API calls, non può fornire un pieno POSIX API; non è in grado di compilarne alcuni UNIX applicationsche possono essere compilati Cygwin. In particolare, questo vale per le applicazioni che richiedono POSIXfunzionalità come fork(), mmap()o ioctl()quelli che si aspettano di essere eseguito in una POSIX environment. Le applicazioni scritte utilizzando una cross-platform libraryche sia stata essa stessa portato su MinGW, come ad esempio SDL, wxWidgets, Qt, o GTK+, di solito compilare come facilmente MinGWcome farebbero in Cygwin.

La combinazione di MinGWe MSYSfornisce un ambiente piccolo e autonomo che può essere caricato su supporti rimovibili senza lasciare voci nel registro o file sul computer. CygwinPortable offre una funzione simile. Fornendo più funzionalità, Cygwin diventa più complicato da installare e mantenere.

È anche possibile cross-compile Windows applicationscon MinGW-GCC under POSIX systems. Ciò significa che gli sviluppatori non hanno bisogno di un'installazione di Windows MSYSper compilare il software che verrà eseguito Windowssenza Cygwin.


2
E 'sicuramente non "più complicato da installare e mantenere" ! Usare apt-cygcome è forse ancora più facile che usare apt in WSL.
not2qubit il

14

Non trascurare il software U / Win di AT&T , progettato per aiutarti a compilare applicazioni Unix su Windows (ultima versione - 06-08-2012; utilizza la Licenza pubblica Eclipse, Versione 1.0).

Come Cygwin devono correre contro una biblioteca; nel loro caso POSIX.DLL. I ragazzi di AT&T sono ingegneri fantastici (lo stesso gruppo che ti ha portato ksh e dot ) e vale la pena dargli un'occhiata.


4
Caspita, quelle sono delle cattive pagine web. Sono stato finalmente in grado di trovare un link per il download su www2.research.att.com/sw/download , ma nessuna documentazione online o informazioni sul progetto.
Fantius

1
Sebbene le informazioni siano utili, ritengo che questa potrebbe essere la risposta a una domanda sulle alternative per MingW o Cygwin piuttosto che questa domanda.
Vivek,

12

Altre risposte hanno già raggiunto l'obiettivo. Voglio solo aggiungere un'illustrazione per una rapida cattura.

inserisci qui la descrizione dell'immagine


11

Cygwin emula l'intero ambiente POSIX, mentre MinGW è un set di strumenti minimo solo per la compilazione (compila l'applicazione nativa Win.) Quindi, se vuoi rendere il tuo progetto multipiattaforma la scelta tra i due è ovvia, MinGW.

Sebbene potresti considerare l'utilizzo di VS su Windows, GCC su Linux / Unices. La maggior parte dei progetti open source lo fa (ad esempio Firefox o Python).


"Most" sembra una parola donnola insignificante qui, specialmente con solo 2 esempi e nessuna statistica. Molti progetti FOSS inseriscono un file di progetto VS come gesto simbolico, sospetto sia più preciso. Ma se l'esperienza passata è qualcosa da fare, GCC o Clang sono di solito più sicuri poiché VS tende a rimanere indietro considerevolmente man mano che gli standard linguistici si evolvono.
underscore_d

Questa è una risposta dal 2009. Oggi le cose sembrano ancora più desolate per GCC. Per quanto riguarda "la maggior parte", se si misura in base all'impatto, solo Firefox e Chrome da soli hanno più utenti di ogni altra cosa.
vartec

2
Ciò che è cambiato da quando ho risposto è che ora clangè una soluzione multipiattaforma praticabile.
vartec,

9

Si noti che il comportamento dell'utilità può davvero variare tra i due.

Ad esempio, Cygwin tar può fork - perché fork () è supportato nella DLL - dove la versione mingw non può. Questo è un problema quando si tenta di compilare mysql dal sorgente.


Questo è il motivo per cui gli ambienti pienamente compatibili con MinGW, ad esempio MSYS2, offrono un Cygwin o un altro strato completamente compatibile POSIX per i dadi e le viti di basso livello delle toolchain necessarie durante la costruzione. Quindi la compilazione e il collegamento effettivi vengono lasciati al compilatore MinGW completamente nativo. MSYS2 è davvero pulito.
underscore_d

9

Per utilizzare Cygwin in un'applicazione commerciale / proprietaria / non open source, dovrai sborsare decine di migliaia di dollari per un " acquisto di licenze " da Red Hat; ciò invalida i termini di licenza standard a un costo considerevole. Google "costo licenza cygwin" e vedere i primi risultati.

Per mingw, tale costo non è sostenuto e le licenze (PD, BSD, MIT) sono estremamente permissive. Al massimo tu può aspettare di fornire i dettagli della licenza con l'applicazione, ad esempio la licenza winpthreads richiesta quando si utilizza mingw64-tdm.

MODIFICA grazie a Izzy Helianthus: la licenza commerciale non è più disponibile o necessaria perché la libreria API trovata nella sottodirectory Winsup di Cygwin è ora distribuita sotto LGPL, al contrario della GPL completa.


2
Un aggiornamento dal sito Web di Redhat (il link da "buyout di licenza" - "Dal 1 ° marzo 2016 Red Hat non vende più la licenza di acquisto commerciale per Cygwin. La licenza commerciale non è più necessaria perché Cygwin è ora distribuito sotto GNU Lesser GPL (LGPL). "> Dal sito Web di Cygwin. La libreria API Cygwin ™ che si trova nella sottodirectory winsup del codice sorgente è coperta dalla GNU Lesser General Public License (LGPL) versione 3 o successive. Per dettagli sui requisiti di LGPLv3, leggi la GNU Lesser General Public License (LGPL).
Izzy Helianthus,

6

Cygwin è progettato per fornire un ambiente POSIX più o meno completo per Windows, incluso un ampio set di strumenti progettati per fornire una vera e propria piattaforma simile a Linux. In confronto, MinGW e MSYS offrono uno strato leggero e minimalista simile a POSIX, con solo gli strumenti più essenziali come gcce bashdisponibili. A causa dell'approccio più minimalista di MinGW, non fornisce il grado di copertura dell'API POSIX offerto da Cygwin e pertanto non è in grado di creare determinati programmi che altrimenti potrebbero essere compilati su Cygwin.

In termini di codice generato dai due, la toolchain Cygwin si basa sul collegamento dinamico a una libreria di runtime di grandi dimensioni cygwin1.dll, mentre la toolchain MinGW compila il codice in binari che si collegano dinamicamente alla libreria C nativa di Windows msvcrt.dlle staticamente a parti diglibc . Gli eseguibili Cygwin sono quindi più compatti ma richiedono una DLL ridistribuibile separata, mentre i binari MinGW possono essere spediti autonomamente ma tendono ad essere più grandi.

Il fatto che i programmi basati su Cygwin richiedano l'esecuzione di una DLL separata comporta anche limitazioni delle licenze. La libreria di runtime Cygwin è concessa in licenza in GPLv3 con un'eccezione di collegamento per le applicazioni con licenze conformi a OSI, pertanto gli sviluppatori che desiderano creare un'applicazione a codice chiuso attorno a Cygwin devono acquisire una licenza commerciale da Red Hat. D'altra parte, il codice MinGW può essere utilizzato in applicazioni sia open-source che closed-source, poiché le intestazioni e le librerie sono autorizzate in modo permissivo.


3

Cygwin è un ambiente simile a Unix e un'interfaccia a riga di comando per Microsoft Windows.

Mingw è una porta software nativa della GNU Compiler Collection (GCC) per Microsoft Windows, insieme a una serie di librerie di importazione e file di intestazione liberamente distribuibili per l'API di Windows. MinGW consente agli sviluppatori di creare applicazioni native di Microsoft Windows.

È possibile eseguire i binari generati mingwsenza l' cygwinambiente, a condizione che siano presenti tutte le librerie (DLL) necessarie.


1

Cygwinutilizza un livello di compatibilità, mentre MinGWè nativo. Questa è una delle differenze principali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.