Qual é a diferença entre o Cygwin e o MinGW?

Eu quero fazer o meu projeto C ++ cross platform, e estou pensando em usar o Cygwin / MinGW. Mas qual é a diferença entre eles?

Outra questão é se eu serei capaz de executar o binário em um sistema sem o Cygwin / MinGW?

Como simplificação, é assim:

  • Compile algo no Cygwin e você está compilando para o Cygwin .

  • Compile algo no MinGW e você está compilando para o Windows .

Sobre o Cygwin

O propósito do Cygwin é tornar as aplicações baseadas em portabilidade * nix para o Windows muito mais fáceis, emulando muitos dos pequenos detalhes que os sistemas operacionais baseados em Unix fornecem, e são documentados pelos padrões POSIX . Se seu aplicativo assumir que pode usar o recurso Unix, como pipes, access ao arquivo e ao diretório no estilo Unix e assim por diante, você poderá compilá-lo no Cygwin e o próprio Cygwin atuará como uma camada de compatibilidade em torno de seu aplicativo. Esses paradigmas específicos do Unix podem continuar sendo usados ​​com pouca ou nenhuma modificação em seu aplicativo.

Se você quiser compilar algo para o Cygwin e distribuir o aplicativo resultante, você também deve distribuir o ambiente de tempo de execução do Cygwin (fornecido pelo cygwin1.dll ) junto com ele, e isso tem implicações para os tipos de licença de software que você pode usar .

Sobre o MinGW

O MinGW é uma porta do Windows das ferramentas do compilador GNU, como o GCC, Make, Bash e assim por diante. Ele não tenta emular ou fornecer compatibilidade abrangente com o Unix, mas fornece o ambiente mínimo necessário para usar o GCC (o compilador GNU) e um pequeno número de outras ferramentas no Windows . Ele não tem uma camada de emulação Unix como Cygwin, mas como resultado, seu aplicativo precisa ser programado especificamente para ser executado no Windows, o que pode significar uma alteração significativa se ele foi criado para ser executado em um ambiente Unix padrão e usa resources específicos do Unix, como os mencionados anteriormente. Por padrão, o código compilado no GCC do MinGW será compilado para um destino nativo do Windows X86, incluindo arquivos .exe e .dll, embora você também possa fazer a compilation cruzada com as configurações corretas. O MinGW é uma alternativa de código aberto ao compilador Microsoft Visual C ++ e suas ferramentas de vinculação / criação associadas.

Estruturas cross-platform consideravelmente sofisticadas existem que facilitam a tarefa de portar aplicativos para vários sistemas operacionais – por exemplo, a estrutura do Qt é uma estrutura popular para aplicativos entre plataformas. Se você usar essa estrutura desde o início, você não apenas reduzirá suas dores de cabeça quando chegar a hora de migrar para outra plataforma, mas também poderá usar os mesmos widgets charts – janelas, menus e controles – em todas as plataformas. Aplicativo GUI.

O Cygwin é uma tentativa de criar um ambiente UNIX / POSIX completo no Windows. Para fazer isso, ele usa várias DLLs. Embora essas DLLs sejam cobertas pela GPLv3 +, sua licença contém uma exceção que não força uma obra derivada a ser coberta pela GPLv3 +. O MinGW é um conjunto de compiladores C / C ++ que permite criar executáveis ​​do Windows sem dependência de tais DLLs – você só precisa dos tempos de execução normais do MSVC, que fazem parte de qualquer instalação normal do Microsoft Windows.

Você também pode obter um ambiente semelhante ao UNIX / POSIX, compilado com o MinGW chamado MSYS . Ele não tem nem perto de todos os resources do Cygwin, mas é ideal para programadores que desejam usar o MinGW.

Para adicionar às outras respostas, o Cygwin vem com as bibliotecas e headers MinGW e você pode compilar sem vincular ao cygwin1.dll usando -mno-cygwin flag com gcc. Eu prefiro muito mais isso usando MinGW simples e MSYS.

A Wikipedia faz uma comparação aqui .

Do site do Cygwin:

  • O Cygwin é um ambiente semelhante ao Linux para o Windows. Ele consiste em duas partes: Uma DLL (cygwin1.dll) que atua como uma camada de emulação da API do Linux, fornecendo uma funcionalidade substancial da API do Linux.
  • Uma coleção de ferramentas que fornecem aparência e comportamento do Linux.

Do site da Mingw:

MinGW (“Minimalista GNU para Windows”) é uma coleção de arquivos de header específicos do Windows livremente disponíveis e livremente distribuíveis e bibliotecas de importação combinadas com conjuntos de ferramentas GNU que permitem produzir programas nativos do Windows que não dependem de DLLs de tempo de execução C de terceiros

O Cygwin usa uma DLL, cygwin.dll, (ou talvez um conjunto de DLLs) para fornecer um tempo de execução semelhante ao POSIX no Windows.

MinGW compila para um aplicativo Win32 nativo.

Se você construir algo com o Cygwin, qualquer sistema em que você o instalar também precisará da (s) DLL (s) Cygwin. Um aplicativo MinGW não precisa de nenhum tempo de execução especial.

Leia estas perguntas respondidas para entender a diferença entre o Cygwin e o MinGW.


Questão # 1: Eu quero criar um aplicativo que eu escreva um código-fonte uma vez, compile-o uma vez e execute-o em qualquer plataforma (por exemplo, Windows, Linux e Mac OS X…).

Resposta # 1: Escreva seu código fonte em JAVA. Compile o código-fonte uma vez e execute-o em qualquer lugar.


Pergunta # 2: Eu quero criar um aplicativo que eu escrevo código-fonte uma vez, mas não há nenhum problema que eu compilar o código-fonte para todas as plataformas separadamente (por exemplo, Windows, Linux e Mac OS X …).

Resposta # 2: Escreva seu código-fonte em C ou C ++. Use apenas arquivos de header padrão. Use um compilador adequado para qualquer plataforma (por exemplo, Visual Studio para Windows, GCC para Linux e XCode para Mac). Observe que você não deve usar nenhum recurso de programação avançada para compilar seu código-fonte em todas as plataformas com sucesso. Se você não usar nenhuma class ou function padrão C ou C ++, seu código-fonte não será compilado em outras plataformas.


Pergunta # 3: Em resposta a questão # 2, é difícil usar o compilador diferente para cada plataforma, existe algum compilador de plataforma cruzada?

Resposta # 3: Sim, use o compilador GCC. É um compilador de plataforma cruzada. Para compilar seu código-fonte no Windows, use o MinGW que fornece o compilador GCC para Windows e compila seu código-fonte para o programa nativo do Windows. Não use nenhum recurso de programação avançada (como a API do Windows) para compilar seu código-fonte em todas as plataformas com êxito. Se você usar as funções da API do Windows, seu código-fonte não será compilado em outras plataformas.


Pergunta 4: Os arquivos de header padrão C ou C ++ não fornecem nenhum recurso de programação avançada como o multiencadeamento. O que eu posso fazer?

Resposta # 4: Você deve usar o padrão POSIX (Portable Operating System Interface [para UNIX]). Ele fornece muitos resources e ferramentas avançadas de programação. Muitos sistemas operacionais totalmente ou parcialmente compatíveis com POSIX (como Mac OS X, Solaris, BSD / OS e …). Alguns sistemas operacionais, embora não oficialmente certificados como compatíveis com POSIX, estão em grande parte em conformidade (como Linux, FreeBSD, OpenSolaris e …). O Cygwin fornece um ambiente de desenvolvimento e tempo de execução compatível com POSIX para o Microsoft Windows.


Portanto:

Para aproveitar o compilador de plataforma cruzada do GCC no Windows, use o MinGW.

Para aproveitar os resources e ferramentas avançados de programação padrão do POSIX no Windows, use o Cygwin.

Wikipedia diz :

MinGW bifurcado da versão 1.3.3 do Cygwin . Embora o Cygwin eo MinGW possam ser usados ​​para portar o software UNIX para o Windows , eles têm diferentes abordagens: O Cygwin tem como objective fornecer uma POSIX layer completa que fornece emulações de várias chamadas de sistema e bibliotecas existentes no Linux , UNIX e variantes BSD . A POSIX layer executada sobre o Windows , sacrificando o desempenho quando necessário para compatibilidade. Assim, essa abordagem requer que programas do Windows escritos com o Cygwin sejam executados em cima de uma biblioteca de compatibilidade copylefted que deve ser distribuída com o programa, junto com o source code do programa. MinGW visa fornecer funcionalidade e desempenho nativos por meio de Windows API calls diretas da Windows API calls . Ao contrário do Cygwin , o MinGW não requer uma DLL camada de compatibilidade e, portanto, os programas não precisam ser distribuídos com o source code .

Como o MinGW é dependente de Windows API calls , ele não pode fornecer uma POSIX API completa; não é possível compilar alguns UNIX applications que podem ser compilados com o Cygwin . Especificamente, isso se aplica a aplicativos que exigem a funcionalidade POSIX como fork() , mmap() ou ioctl() e aqueles que esperam ser executados em um POSIX environment . Aplicações escritas usando uma cross-platform library que tenha sido portada para o MinGW , como SDL , wxWidgets , Qt ou GTK+ , geralmente compilarão facilmente no MinGW como no Cygwin .

A combinação de MinGW e MSYS fornece um ambiente pequeno e independente que pode ser carregado em mídia removível sem deixar inputs no registro ou arquivos no computador. Cygwin Portable fornece um recurso semelhante. Ao fornecer mais funcionalidades, o Cygwin se torna mais complicado de instalar e manter.

Também é possível cross-compile Windows applications com o MinGW-GCC under POSIX systems . Isso significa que os desenvolvedores não precisam de uma instalação do Windows com o MSYS para compilar software que será executado no Windows sem o Cygwin .

Do ponto de vista de portar um programa em C, uma boa maneira de entender isso é dar um exemplo:

 #include  #include  int main(void) { struct stat stbuf; stat("c:foo.txt", &stbuf); system("command"); printf("Hello, World\n"); return 0; } 

Se mudarmos stat para _stat , podemos compilar este programa com o Microsoft Visual C. Também podemos compilar este programa com o MinGW e com o Cygwin.

Em Microsoft Visual C, o programa será vinculado a uma biblioteca de tempo de execução redistribuível MSVC: mxvcrtnn.dll , onde nn é algum sufixo de versão. Para enviar este programa, teremos que include essa DLL. Essa DLL fornece _stat , system e printf .

Em MinGW, o programa será vinculado ao msvcrt.dll , que é uma biblioteca interna, não documentada e não-versionada que faz parte do Windows e fora dos limites para o uso do aplicativo. Essa biblioteca é essencialmente uma bifurcação da biblioteca de tempo de execução redistribuível do MS Visual C para uso pelo próprio Windows.

Em ambos, o programa terá comportamentos semelhantes:

  • a function stat retornará informações muito limitadas – sem permissions úteis ou número de inode, por exemplo.
  • o caminho c:file.txt é resolvido de acordo com o diretório de trabalho atual associado à unidade c:
  • system usa cmd.exe /c para executar o comando externo.

Também podemos compilar o programa no Cygwin. Da mesma forma que o tempo de execução redistribuível usado pelo MS Visual C, o programa Cygwin será vinculado às bibliotecas de tempo de execução do Cygwin: cygwin1.dll (Cygwin proper) e cyggcc_s-1.dll (suporte a tempo de execução do GCC). Como o Cygwin está agora sob a LGPL, podemos empacotar com nosso programa, mesmo que não seja um software livre compatível com GPL, e enviar o programa.

No Cygwin, as funções da biblioteca se comportarão de maneira diferente:

  • a function stat possui uma funcionalidade rica, retornando valores significativos na maioria dos campos.
  • o caminho c:file.txt não é compreendido como contendo uma referência de letra de unidade, já que c: não é seguido por uma barra. O cólon é considerado parte do nome e de alguma forma mutilado nele. Não existe um conceito de caminho relativo contra um volume ou unidade no Cygwin, nenhum conceito de “unidade atualmente registrada” e nenhum diretório de trabalho atual por unidade.
  • a function do system tenta usar o interpretador /bin/sh -c . O Cygwin irá resolver o caminho / acordo com a localização do seu executável, e espera que um programa sh.exe seja co-localizado com o seu executável.

Tanto o Cygwin quanto o MinGW permitem que você use as funções do Win32. Se você quiser chamar MessageBox ou CreateProcess , você pode fazer isso. Você também pode criar facilmente um programa que não requer uma janela de console, usando gcc -mwindows , sob MinGW e Cygwin.

O Cygwin não é estritamente POSIX. Além de fornecer access à API do Windows, ele também fornece suas próprias implementações de algumas funções do Microsoft C (coisas encontradas em msvcrt.dll ou nos msvcrtnn.dll execução msvcrtnn.dll ). Um exemplo disso é a família spawn* de funções como spawnvp . É uma boa idéia usar em vez de fork e exec no Cygwin, já que eles mapeiam melhor o modelo de criação de processos do Windows que não tem nenhum conceito de fork .

Portanto:

  • Os programas do Cygwin não são menos “nativos” que os programas do MS Visual C por requerer o acompanhamento de bibliotecas. Espera-se que as implementações de linguagem de programação no Windows forneçam suas próprias implementações em tempo de execução e até mesmo em linguagem C. Não há “libc” no Windows para uso público.

  • O fato de o MinGW não exigir nenhuma DLL de terceiros é realmente uma desvantagem; ele depende de uma bifurcação interna do Windows do tempo de execução do Visual C, não documentada. O MinGW faz isso porque a exceção da biblioteca do sistema GPL se aplica ao msvcrt.dll , o que significa que os programas GPL-ed podem ser compilados e redistribuídos com o MinGW.

  • Devido ao seu suporte muito mais amplo e profundo ao POSIX comparado ao msvcrt.dll , o Cygwin é de longe o ambiente superior para portar programas POSIX. Como está agora sob a LGPL, permite que os aplicativos com todos os tipos de licenças, de código aberto ou fechado, sejam redistribuídos. Cygwin ainda contém emulação e termios VT100, que funcionam com o console da Microsoft! Um aplicativo POSIX que configura o modo raw com tcsetattr e usa códigos VT100 para controlar o cursor funcionará diretamente na janela cmd.exe . No que diz respeito ao usuário final, é um aplicativo de console nativo que faz chamadas do Win32 para controlar o console.

Contudo:

  • Como uma ferramenta de desenvolvimento nativa do Windows, o Cygwin tem algumas peculiaridades, como a manipulação de caminhos que é estranha ao Windows, a dependência de alguns caminhos hard-coded como /bin/sh e outros problemas. Essas diferenças são o que torna os programas Cygwin “não-nativos”. Se um programa usa um caminho como um argumento ou uma input de uma checkbox de diálogo, os usuários do Windows esperam que esse caminho funcione da mesma maneira que em outros programas do Windows. Se não funcionar assim, isso é um problema.

Plug: Logo após o anúncio da LGPL, iniciei o projeto Cygnal (Cygwin Native Application Library) para fornecer uma bifurcação da DLL do Cygwin que visa corrigir esses problemas. Os programas podem ser desenvolvidos no Cygwin e, em seguida, implantados com a versão Cygnal do cygwin1.dll sem recompilar. À medida que esta biblioteca melhora, gradualmente eliminará a necessidade de MinGW.

Quando o Cygnal soluciona o problema de processamento de caminho, será possível desenvolver um único executável que funcione com os caminhos do Windows quando fornecido como um aplicativo do Windows com o Cygnal e funcione perfeitamente com os caminhos do Cygwin quando instalado em seu /usr/bin no Cygwin. No Cygwin, o executável funcionará de forma transparente com um caminho como /cygdrive/c/Users/bob . Na implantação nativa em que está vinculando a versão Cygnal do cygwin1.dll , esse caminho não fará sentido, enquanto entenderá c:foo.txt .

Não negligencie o software U / Win da AT & T , que é projetado para ajudá-lo a compilar aplicativos Unix no Windows (última versão – 2012-08-06; usa Eclipse Public License, Versão 1.0).

Como o Cygwin, eles precisam correr contra uma biblioteca; no caso deles POSIX.DLL . Os caras da AT & T são ótimos engenheiros (mesmo grupo que te trouxe ksh e ponto ) e vale a pena conferir o material deles.

O Cygwin emula todo o ambiente POSIX, enquanto o MinGW é o conjunto mínimo de ferramentas para compilation (compila o aplicativo nativo do Win). Então, se você quiser fazer o seu projeto multi-plataforma, a escolha entre os dois é óbvia, MinGW.

Embora você possa considerar o uso do VS no Windows, o GCC no Linux / Unices. A maioria dos projetos de código aberto faz isso (por exemplo, Firefox ou Python).

Para usar o Cygwin em um aplicativo comercial / proprietário / não-aberto, você precisará desembolsar dezenas de milhares de dólares para uma ” compra de licença ” da Red Hat; isso invalida os termos de licenciamento padrão a um custo considerável. Google “custo de licença cygwin” e ver primeiros resultados.

Para o mingw, nenhum custo é incorrido e as licenças (PD, BSD, MIT) são extremamente permissivas. No máximo, pode- se esperar que você forneça detalhes da licença com seu aplicativo, como a licença winpthreads necessária ao usar o mingw64-tdm.

EDIT graças a Izzy Helianthus: A licença comercial não está mais disponível ou é necessária porque a biblioteca da API encontrada no subdiretório de winsup do Cygwin está sendo distribuída sob a LGPL, em oposição à GPL completa.

Observe que o comportamento de utilidade pode variar genuinamente entre os dois.

Por exemplo, tar Cygwin pode bifurcar – porque fork () é suportado na DLL – onde a versão mingw não pode. Este é um problema ao tentar compilar o mysql da fonte.

O Cygwin é projetado para fornecer um ambiente POSIX mais ou menos completo para o Windows, incluindo um extenso conjunto de ferramentas projetadas para fornecer uma plataforma completa semelhante ao Linux. Em comparação, o MinGW e o MSYS fornecem uma camada leve e minimalista semelhante ao POSIX, com apenas as ferramentas mais essenciais, como o gcc e o bash disponíveis. Por causa da abordagem mais minimalista do MinGW, ele não fornece o grau de cobertura da API do POSIX que o Cygwin oferece e, portanto, não pode construir certos programas que podem ser compilados no Cygwin.

Em termos do código gerado pelos dois, o Cygwin toolchain depende da vinculação dinâmica a uma grande biblioteca de tempo de execução, cygwin1.dll , enquanto o MinGW toolchain compila o código para binários que se vinculam dinamicamente ao msvcrt.dll biblioteca C nativa do Windows, bem como estaticamente para partes da glibc . Os executáveis ​​do Cygwin são, portanto, mais compactos, mas requerem uma DLL redistribuível separada, enquanto os binários do MinGW podem ser enviados autônomos, mas tendem a ser maiores.

O fato de os programas baseados em Cygwin exigirem uma DLL separada para execução também leva a restrições de licenciamento. A biblioteca de tempo de execução Cygwin é licenciada sob a GPLv3 com uma exceção de vinculação para aplicativos com licenças compatíveis com OSI, portanto, os desenvolvedores que desejam criar um aplicativo de código fechado em torno do Cygwin devem adquirir uma licença comercial da Red Hat. Por outro lado, o código MinGW pode ser usado em aplicativos de código aberto e de código fechado, pois os headers e as bibliotecas são licenciados permissivamente.

Cygwin é um ambiente Unix-like e interface de linha de comando para o Microsoft Windows.

O Mingw é uma porta de software nativa do GNU Compiler Collection (GCC) para o Microsoft Windows, junto com um conjunto de bibliotecas de importação distribuídas gratuitamente e arquivos de header para a API do Windows. O MinGW permite que os desenvolvedores criem aplicativos nativos do Microsoft Windows.

Você pode executar binários gerados com o mingw sem o ambiente cygwin , desde que todas as bibliotecas necessárias (DLLs) estejam presentes.

Cygwin usa uma camada de compatibilidade, enquanto o MinGW é nativo. Essa é uma das principais diferenças.