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?
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:
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.
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.
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.
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
pacchetto Cygwin. MinGW-64 sarà quindi disponibile come x86_64-w64-mingw32-gcc
comando chiamato goffamente . Per favore Dio (i), qualcuno unifica già i nomi di queste cose insanguinate.
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
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.
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ì:
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 stat
a _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.dll
dove nn
è presente un suffisso di versione. Per spedire questo programma dovremo includere quella DLL. Che DLL fornisce _stat
, system
e 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:
stat
funzione restituirà informazioni molto limitate, ad esempio nessuna autorizzazione utile o numero di inode.c:file.txt
viene risolto in base alla directory di lavoro corrente associata all'unità c:
.system
utilizza cmd.exe /c
per 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:
stat
funzione ha una ricca funzionalità, restituendo valori significativi nella maggior parte dei campi.c:file.txt
non è 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à.system
funzione tenta di usare l' /bin/sh -c
interprete. Cygwin risolverà il /
percorso in base alla posizione del file eseguibile e si aspetterà che un sh.exe
programma sia collocato insieme al file eseguibile.Sia Cygwin che MinGW consentono di utilizzare le funzioni Win32. Se vuoi chiamare MessageBox
o CreateProcess
, puoi farlo. Puoi anche creare facilmente un programma che non richiede una finestra della console, usando gcc -mwindows
MinGW 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.dll
o msvcrtnn.dll
runtime ridistribuibili ). Un esempio di questo è la spawn*
famiglia di funzioni come spawnvp
. Si tratta di una buona idea da utilizzare al posto di fork
e exec
su 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 tcsetattr
e utilizza i codici VT100 per controllare il cursore funzionerà proprio nella cmd.exe
finestra. Per quanto riguarda l'utente finale, è un'app console nativa che effettua chiamate Win32 per controllare la console.
Però:
/bin/sh
e 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.dll
senza 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/bin
su 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
.
MinGW
biforcuta dalla versione 1.3.3 diCygwin
. Sebbene entrambiCygwin
eMinGW
possono essere utilizzati per portoUNIX
softwareWindows
, hanno approcci diversi:Cygwin
mira a fornire un completoPOSIX layer
che fornisce emulazione di diverse chiamate di sistema e librerie esistenti suLinux
,UNIX
e leBSD
varianti. LaPOSIX layer
corre in cimaWindows
, sacrificare le prestazioni, se necessario, per la compatibilità. Di conseguenza, questo approccio richiede che iWindows
programmi scritti conCygwin
vengano eseguiti su una libreria di compatibilità copyleft che deve essere distribuita con il programma, insieme a quella del programmasource code
.MinGW
mira a fornire funzionalità e prestazioni native direttamenteWindows API calls
. A differenzaCygwin
,MinGW
non richiede un livello di compatibilitàDLL
e quindi i programmi non devono essere distribuiti consource code
.Perché
MinGW
dipende daWindows API calls
, non può fornire un pienoPOSIX API
; non è in grado di compilarne alcuniUNIX applications
che possono essere compilatiCygwin
. In particolare, questo vale per le applicazioni che richiedonoPOSIX
funzionalità comefork()
,mmap()
oioctl()
quelli che si aspettano di essere eseguito in unaPOSIX environment
. Le applicazioni scritte utilizzando unacross-platform library
che sia stata essa stessa portato suMinGW
, come ad esempioSDL
,wxWidgets
,Qt
, oGTK+
, di solito compilare come facilmenteMinGW
come farebbero inCygwin
.La combinazione di
MinGW
eMSYS
fornisce un ambiente piccolo e autonomo che può essere caricato su supporti rimovibili senza lasciare voci nel registro o file sul computer.Cygwin
Portable offre una funzione simile. Fornendo più funzionalità,Cygwin
diventa più complicato da installare e mantenere.È anche possibile
cross-compile Windows applications
conMinGW-GCC under POSIX systems
. Ciò significa che gli sviluppatori non hanno bisogno di un'installazione di WindowsMSYS
per compilare il software che verrà eseguitoWindows
senzaCygwin
.
apt-cyg
come è forse ancora più facile che usare apt in WSL.
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.
Altre risposte hanno già raggiunto l'obiettivo. Voglio solo aggiungere un'illustrazione per una rapida cattura.
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).
clang
è una soluzione multipiattaforma praticabile.
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.
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.
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 gcc
e bash
disponibili. 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.dll
e 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.
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 mingw
senza l' cygwin
ambiente, a condizione che siano presenti tutte le librerie (DLL) necessarie.
Cygwin
utilizza un livello di compatibilità, mentre MinGW
è nativo. Questa è una delle differenze principali.