Qual é a diferença entre Cygwin e MinGW?


658

Quero criar meu projeto C ++ em várias plataformas e estou pensando em usar o Cygwin / MinGW. Mas qual é a diferença entre eles?

Outra pergunta é se vou conseguir rodar o binário em um sistema sem Cygwin / MinGW?

Respostas:


629

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 a Cygwin

O objetivo do Cygwin é facilitar a transferência de aplicativos baseados em Unix para o Windows, imitando muitos dos pequenos detalhes que os sistemas operacionais baseados em Unix fornecem e são documentados pelos padrões POSIX . Seu aplicativo pode usar o recurso Unix, como pipes, acesso a arquivos e diretórios no estilo Unix, e assim por diante, e pode ser compilado com o Cygwin, que atuará como uma camada de compatibilidade em torno do aplicativo, para que muitos desses paradigmas específicos do Unix possam continue a ser usado.

Quando você distribui seu software, o destinatário precisará executá-lo junto com o ambiente de tempo de execução Cygwin (fornecido pelo arquivo cygwin1.dll). Você pode distribuir isso com o seu software, mas ele terá que cumprir com sua licença de código aberto. Pode até acontecer que apenas vincular seu software a ele, mas distribuir a dll separadamente, ainda exija que você respeite a licença de código aberto.

Sobre o MinGW

O MinGW pretende ser simplesmente uma porta do Windows das ferramentas do compilador GNU, como 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 possui uma camada de emulação Unix como o Cygwin, mas como resultado, seu aplicativo precisa ser especificamente programado para ser executado no Windows, o que pode significar alterações significativas se ele foi criado para depender da execução em um ambiente Unix padrão e usa recursos 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 compilar com as configurações corretas, já que você está basicamente usando o conjunto de ferramentas do compilador GNU.

O MinGW é essencialmente uma alternativa ao compilador Microsoft Visual C ++ e suas ferramentas de vinculação / criação associadas. Em alguns casos, pode ser possível usar o MinGW para compilar algo destinado à compilação com o Microsoft Visual C ++, com as bibliotecas corretas e, em alguns casos, com outras modificações.

O MinGW inclui algumas bibliotecas padrão básicas para interagir com o sistema operacional Windows, mas, como as bibliotecas padrão normais incluídas na coleção do compilador GNU, elas não impõem restrições de licenciamento ao software que você criou.

Para aplicativos de software não triviais, torná-los entre plataformas pode ser um desafio considerável, a menos que você use uma estrutura abrangente entre plataformas. Na época em que escrevi isso, o framework Qt era um dos mais populares para esse fim, permitindo a criação de aplicativos gráficos que funcionam em sistemas operacionais, incluindo Windows, mas também existem outras opções. Se você usar essa estrutura desde o início, poderá não apenas reduzir suas dores de cabeça quando chegar a hora de portar para outra plataforma, mas também usar os mesmos widgets gráficos - janelas, menus e controles - em todas as plataformas, se estiver escrevendo um Aplicativo GUI e faça com que eles pareçam nativos para o usuário.


43
O bash que acompanha o MinGW não é um programa nativo do Windows. Depende da DLL do MSYS, que é uma bifurcação da DLL do Cygwin. O mesmo para muitos dos outros utilitários Unix que acompanham o MinGW / MSYS. O MinGW gcc é de fato um programa nativo. Make está disponível na versão nativa e na MSYS.
AK2

6
alguma diferença em termos de velocidade?
EKanadily

6
A diferença de velocidade será ignorada na maioria das situações. Qualquer diferença se resume a quanto o nível adicional de abstração fornecido pela camada de compatibilidade do cygwin torna as coisas mais lentas. Pode ter um efeito mensurável em coisas como E / S. Por exemplo, há muito tempo, o Git era executado apenas no Windows no cygwin e, por isso, era um pouco mais lento. Por outro lado, se você codifica usando uma estrutura, também é uma camada de abstração com o potencial de retardar algumas coisas de qualquer maneira.
thomasrutter

28
Devo observar que o código compilado para o cygwin ainda é um código nativo - não precisa ser executado por um intérprete como o Java. É só que, quando ele precisa interagir com certos recursos do sistema operacional, como disco / arquivo, ele passa por outra camada.
thomasrutter

4
Em geral, você não seria capaz de comparar, porque precisa escrever seu código de maneira diferente, dependendo se é para cygwin ou não. Embora para qualquer software pequeno e simples como "olá mundo", o equivalente do cygwin seja maior apenas por causa da biblioteca de tempo de execução do cygwin. Se você não contar o tamanho da biblioteca de tempo de execução do cygwin, a versão do cygwin geralmente será menor, mas acho que é uma figura falsa, já que a biblioteca sempre precisará ser fornecida com o software. Dito isto, se você estiver usando bibliotecas / estruturas não triviais, isso dependerá mais disso.
perfil completo de thomasrutter

311

Cygwin é uma tentativa de criar um ambiente UNIX / POSIX completo no Windows. Para fazer isso, ele usa várias DLLs. Embora essas DLLs estejam cobertas pelo GPLv3 +, sua licença contém uma exceção que não força um trabalho derivado a ser coberto pelo GPLv3 +. O MinGW é um conjunto de compiladores C / C ++ que permite criar executáveis ​​do Windows sem depender dessas 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 pequeno ambiente semelhante ao UNIX / POSIX, compilado com o MinGW chamado MSYS . Ele não possui nem todos os recursos do Cygwin, mas é ideal para programadores que desejam usar o MinGW.


59
Mas se eu quiser lançar um software gratuito que não seja da GPL? Desculpe, eu não sou fã da GPL, é tudo.

19
@ Dan Você não precisa redistribuir o tempo de execução que o MinGW usa - faz parte do Windows.

14
@ ak2: isso é verdade, mas enganoso. O ambiente cygwyn gcc + cygwin assume como padrão a produção de binários vinculados à dll cygwin (GPL). O padrão mingw + msys é produzir binários vinculados à plataforma C lib.
Sean McMillan

4
@DanMoulding Se você não é um fã da Microsoft, terá que ignorar esses sentimentos para desenvolver o Windows em primeiro lugar. ;-)
Arda Xi

14
@anon "Mas se eu quiser liberar software gratuito que não seja da GPL?" .. o cygwin tem uma exceção especial em seus termos de licenciamento que permite distribuir o software livre vinculado a ele sob outras licenças de código aberto (não-GPL). Consulte "Exceção de licenciamento de código aberto" aqui: cygwin.com/licensing.html
steve cook

138

Para adicionar outras respostas, o Cygwin vem com as bibliotecas e cabeçalhos do MinGW e você pode compilar sem vincular ao cygwin1.dll usando o sinalizador -mno-cygwin com o gcc. Eu prefiro isso a usar MinGW e MSYS simples.


31
Isso não funciona mais com o cygwin 1.7.6. gcc: o sinalizador -mno-cygwin foi removido; use um compilador cruzado segmentado por mingw.
sigjuice

2
@sigjuice: true, mas a antiga bandeira -mno-cygwin ainda funciona para o GCC 3.x:gcc-3 -mno-cygwin
Amro

1
Então, isso significa que eu preciso baixar as bibliotecas mingw do site oficial da mingw para compilar um destino mingw de um host cygwin? Ou essas bibliotecas podem ser baixadas do sistema de pacotes da Cygwin?
CMCDragonkai

5
@CMCDragonkai Você pode adquirir compiladores compatíveis com mingw no site Cygwin executando o utilitário de configuração e localizando e marcando-os. Portanto, embora o gcc não gere mais código compatível com o mingw, no Cygwin você pode executar um "mingw-gcc" (esse não é o nome completo) para criar o mesmo tipo de executável que o compilador mingw usaria no msys.
Cardiff space man

9
Para alterar a resposta útil de cardiff, os pacotes e comandos MinGW do Cygwin têm nomes um tanto obscuros. Para instalar o MinGW-64 ( praticamente o que você sempre quer hoje em dia ), instale o mingw64-x86_64-gcc-corepacote Cygwin. O MinGW-64 estará disponível como o x86_64-w64-mingw32-gcccomando desajeitado . Por favor Deus, alguém já unifica os nomes dessas coisas sangrentas.
Cecil Curry

60

A Wikipedia faz uma comparação aqui .

No site da Cygwin :

  • Cygwin é um ambiente semelhante ao Linux para Windows. 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 a aparência e funcionalidade do Linux.

No site da Mingw :

O MinGW ("Minimalistic GNU for Windows") é uma coleção de arquivos de cabeçalho e bibliotecas de importação específicos do Windows disponíveis e distribuíveis gratuitamente, combinados 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


47

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 em um aplicativo Win32 nativo.

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


42

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


Pergunta nº 1: Quero criar um aplicativo que escreva o código-fonte uma vez, compile-o e execute-o em qualquer plataforma (por exemplo, Windows, Linux e Mac OS X…).

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


Pergunta 2: Quero criar um aplicativo que escreva o código-fonte uma vez, mas não há problema em compilar o código-fonte para qualquer plataforma separadamente (por exemplo, Windows, Linux e Mac OS X…).

Resposta 2: Escreva seu código-fonte em C ou C ++. Use apenas arquivos de cabeçalho 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çado para compilar seu código-fonte em todas as plataformas com êxito. Se você não usar nenhuma classe ou função padrão C ou C ++, seu código-fonte não será compilado em outras plataformas.


Pergunta 3: Em resposta à pergunta 2, é difícil usar um compilador diferente para cada plataforma. Existe algum compilador multiplataforma?

Resposta nº 3: Sim, use o compilador GCC. É um compilador multiplataforma. Para compilar seu código-fonte no Windows, use o MinGW que fornece o compilador GCC para Windows e compila seu código-fonte no programa Windows nativo. Não use nenhum recurso de programação avançado (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 nº 4: os arquivos de cabeçalho padrão C ou C ++ não fornecem recursos avançados de programação, como multiencadeamento. O que eu posso fazer?

Resposta nº 4: Você deve usar o padrão POSIX (Interface do sistema operacional portátil [para UNIX]). Ele fornece muitos recursos e ferramentas avançados de programação. Muitos sistemas operacionais são compatíveis total ou parcialmente com POSIX (como Mac OS X, Solaris, BSD / OS e ...). Alguns sistemas operacionais, embora não oficialmente certificados como compatíveis com POSIX, são conformes em grande parte (como Linux, FreeBSD, OpenSolaris e ...). O Cygwin fornece um ambiente de tempo de execução e desenvolvimento amplamente compatível com POSIX para o Microsoft Windows.


Portanto:

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

Para aproveitar os recursos e ferramentas de programação avançada padrão POSIX do Windows, use Cygwin.


4
Sobre o seu pequeno FAQ: 1) Você está certo, se precisar de algo que funcione em qualquer lugar e não precise ser compilado, escolha algo como java (também não se esqueça de python, perl, ruby ​​e o restante das linguagens de script) 2) Isso está um pouco errado no caso de C, já que todos os compiladores de C o suportam muito bem. 3) Você ainda pode usar a API do win32, mas precisa envolvê-la em uma camada de portabilidade, para que seja apenas um problema de design.
precisa saber é o seguinte

1
4) Isso está totalmente errado, por causa das razões expostas acima, já que o POSIX é apenas outra API, também se você defender tanto POSIX, você deve saber que mesmo os Unices não precisam implementar o mesmo conjunto de POSIX, então como você lida com isso? A API do POSIX em tempo real vem à mente. E isso faz com que você conclua completamente falso e errado, porque você não precisa do POSIX para nada no Windows, basta usar a API do Win32. Ou como você acha que o Qt, GTK e WxWidgets encontraram uma maneira de ser multiplataforma, acho que todos eles precisam usar o cygwin no Windows. -1 voto na sua resposta.
precisa saber é o seguinte

4
Não entendo seu argumento, @ Coyote21. Você está dizendo que o POSIX não é adequado para o desenvolvimento de plataforma cruzada? Você está dizendo que a única maneira apropriada de escrever código em C / C ++ para várias plataformas é escrever sua própria camada de compatibilidade para cada plataforma que você deseja oferecer suporte? Não vejo nada de errado com a sugestão de começar com o POSIX. Você precisa ver até onde isso pode chegar e se será necessária uma solução abrangente de camada de compatibilidade. Grandes camadas de compatibilidade não são a norma. Dizer o contrário é argumentar que o POSIX é uma falha completa.
David Gladfelter 22/10/12

O multithreading é implementado através da camada POSIX, mesmo no MinGW.
Alexander Shishenko

1
"você não deve usar nenhum recurso avançado de programação para compilar seu código fonte em todas as plataformas com sucesso." Você realmente precisa esclarecer o que quis dizer com "recursos avançados de programação". Com base em uma linha posterior, acho que você quer dizer recursos específicos da plataforma . Se você quis dizer recursos de linguagem moderna, então não, porque existem compiladores competentes para "todas as [principais] plataformas", e não devemos nos privar de recursos apenas para apoiar aqueles cujos compiladores ou bibliotecas ainda estão para trás. Com um compilador decente, C / ++ padrão e bibliotecas de plataforma cruzada, podemos ser bastante avançados.
underscore_d

34

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

#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 mudarmos statpara_stat , podemos compilar este programa com o Microsoft Visual C. Também podemos compilar este programa com o MinGW e com o Cygwin.

No Microsoft Visual C, o programa será vinculado a uma biblioteca de tempo de execução redistribuível do MSVC:, mxvcrtnn.dllonde nnhá algum sufixo da versão. Para enviar este programa, teremos que incluir essa DLL. Essa DLL fornece _stat, systemeprintf . (Também temos a opção de vincular estaticamente o tempo de execução.)

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

Sob ambos, o programa terá comportamentos semelhantes:

  • a statfunção retornará informações muito limitadas - sem permissões ú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:.
  • systemusa cmd.exe /cpara executar o comando externo.

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

Sob Cygwin, as funções da biblioteca se comportam de maneira diferente:

  • a statfunção possui funcionalidade avançada, retornando valores significativos na maioria dos campos.
  • o caminho c:file.txtnão é entendido como contendo uma referência de letra de unidade, pois 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 em relação a um volume ou unidade no Cygwin, nenhum conceito de "unidade atualmente registrada" e nenhum diretório de trabalho atual por unidade.
  • a systemfunção tenta usar o /bin/sh -cintérprete. O Cygwin resolverá o /caminho de acordo com a localização do seu executável e espera que um sh.exeprograma 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ê deseja ligar MessageBoxou CreateProcess, pode fazer isso. Você também pode criar facilmente um programa que não exija uma janela do console, usando gcc -mwindowsMinGW e Cygwin.

Cygwin não é estritamente POSIX. Além de fornecer acesso à API do Windows, ele também fornece suas próprias implementações de algumas funções do Microsoft C (itens encontrados nos tempos de execução msvcrt.dllredistribuíveis msvcrtnn.dll). Um exemplo disso é a spawn*família de funções como spawnvp. É uma boa idéia usar em vez forke execno Cygwin, pois eles mapeiam melhor o modelo de criação de processos do Windows que não tem nenhum conceito fork.

Portanto:

  • Os programas Cygwin não são menos "nativos" que os programas do MS Visual C por exigir o acompanhamento de bibliotecas. Espera-se que as implementações da linguagem de programação no Windows forneçam seu próprio tempo de execução, até mesmo as implementações da linguagem C. Não há "libc" no Windows para uso público.

  • O fato de o MinGW não exigir DLL de terceiros é realmente uma desvantagem; depende de uma bifurcação interna não documentada do Windows do tempo de execução do Visual C. O MinGW faz isso porque a exceção da biblioteca do sistema GPL se aplica 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 em comparação com msvcrt.dll, o Cygwin é de longe o ambiente superior para portar programas POSIX. Como agora está sob a LGPL, permite a redistribuição de aplicativos com todos os tipos de licenças, de código aberto ou fechado. Cygwin ainda contém emulação VT100 e termios, que funcionam com o console da Microsoft! Um aplicativo POSIX que configura o modo bruto com tcsetattre usa códigos VT100 para controlar o cursor funcionará diretamente na cmd.exejanela. No que diz respeito ao usuário final, é um aplicativo de console nativo que faz chamadas Win32 para controlar o console.

Contudo:

  • Como uma ferramenta de desenvolvimento nativa do Windows, o Cygwin possui algumas peculiaridades, como o tratamento de caminhos estranhos ao Windows, dependência de alguns caminhos codificados como /bin/shoutros problemas. Essas diferenças são o que torna os programas Cygwin "não nativos". Se um programa seguir um caminho como argumento ou como entrada de uma caixa 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 dessa maneira, 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.dllsem recompilar. À medida que essa biblioteca for aprimorada, eliminará gradualmente a necessidade de MinGW.

Quando o Cygnal resolver o problema de manipulação de caminhos, será possível desenvolver um único executável que funcione com os caminhos do Windows quando enviado como um aplicativo do Windows com Cygnal, e funcione perfeitamente com os caminhos do Cygwin quando instalado no /usr/binCygwin. No Cygwin, o executável funcionará de maneira transparente com um caminho parecido /cygdrive/c/Users/bob. Na implantação nativa em que está vinculado à versão do Cygnal cygwin1.dll, esse caminho não fará sentido, ao passo que entenderá c:foo.txt.


2
Excelente resposta. Mostrar o que acontece quando o mesmo trecho de código é compilado, vinculado e executado em cada um dos três ambientes é fundamental e esclarece as diferenças.
drlolly

@Kaz Como está indo esse desenvolvimento? Parece repetitivo, mas parece morto desde pelo menos um ano atrás. Por que você não usa o GitHub para que as pessoas possam ajudar e participar?
precisa saber é o seguinte

2
@ not2qubit Sinto que tenho melhor controle sobre meus projetos quando eles estão hospedados no meu próprio servidor que eu me controle. Eu estou usando git; o repositório pode ser puxado. Posso aceitar solicitações pull por e-mail (como Linus Torvalds as projetou). Também posso fornecer uma conta com privilégios de confirmação a alguém que se torna um colaborador no nível do mantenedor. Cygnal funciona bem; Estou agrupando-o regularmente nas versões do Windows de novos lançamentos da linguagem TXR. Vou rebase Cygnal-lo para uma nova linha de base em algum momento Cygwin no início de 2019.
Kaz

@ not2qubit Observe que todas as 17 questões na agenda do Cygnal são abordadas. Ninguém sugeriu novos requisitos ou reclamou da maneira como esses 17 são tratados. portanto, não há outro desenvolvimento necessário além do rebase para o Cygwin mais recente, o que não é extremamente urgente.
Kaz

27

Wikipedia diz :

MinGWbifurcada da versão 1.3.3 de Cygwin. Embora ambos Cygwin e MinGWpode ser usada para portar UNIXsoftware para Windows, eles têm abordagens diferentes: Cygwintem como objetivo fornecer uma solução completa POSIX layer que fornece emulações de várias chamadas do sistema e bibliotecas que existem no Linux, UNIXe as BSDvariantes. É POSIX layer executado em cima Windows, sacrificando o desempenho sempre que necessário para compatibilidade. Dessa forma, essa abordagem requer que os Windowsprogramas gravados Cygwinsejam executados em cima de uma biblioteca de compatibilidade copyleft que deve ser distribuída com o programa, juntamente com a do programa source code. MinGWO objetivo é fornecer funcionalidade e desempenho nativos via direta Windows API calls. Ao contrário Cygwin,MinGWnão requer uma camada de compatibilidade DLLe, portanto, os programas não precisam ser distribuídos source code.

Porque MinGWé dependente Windows API calls, não pode fornecer um total POSIX API; é incapaz de compilar alguns UNIX applicationsque podem ser compilados Cygwin. Especificamente, isso se aplica a aplicativos que exigem POSIXfuncionalidades como fork(), mmap()ou ioctl()e aqueles que esperam ser executados em um POSIX environment. Os aplicativos escritos usando um cross-platform libraryque tem em si foi portado para MinGW, como SDL, wxWidgets, Qt, ou GTK+, normalmente irá compilar como facilmente em MinGWcomo fariam em Cygwin.

A combinação MinGWe MSYSfornece um ambiente pequeno e independente que pode ser carregado na mídia removível sem deixar entradas no registro ou arquivos no computador. CygwinPortátil oferece um recurso semelhante. Ao fornecer mais funcionalidade, Cygwin fica mais complicado instalar e manter.

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


2
Definitivamente, não é "mais complicado instalar e manter" ! Use apt-cygcomo talvez ainda mais fácil do que usar o apt no WSL.
precisa saber é o seguinte

14

Não ignore o software U / Win da AT&T , 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 Cygwin, eles precisam correr contra uma biblioteca; no caso deles POSIX.DLL. Os caras da AT&T são ótimos engenheiros (o mesmo grupo que trouxe ksh e dot ) e vale a pena conferir o material deles.


4
Uau, essas são algumas páginas da web ruins. Finalmente, encontrei um link para download em www2.research.att.com/sw/download , mas nenhuma documentação ou informações on-line sobre o projeto.
Fantius 2/02/12

1
Embora as informações sejam úteis, acho que essa poderia ser a resposta para uma pergunta sobre alternativas para MingW ou Cygwin, e não para esta pergunta.
Vivek #

12

Outras respostas já atingiram o alvo. Eu só quero adicionar uma ilustração para uma captura rápida.

insira a descrição da imagem aqui


11

O Cygwin emula todo o ambiente POSIX, enquanto o MinGW é um conjunto mínimo de ferramentas para compilação (compila o aplicativo nativo do Win.) Portanto, se você deseja tornar seu projeto entre plataformas, a escolha entre os dois é óbvia, o 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).


"Most" parece aqui uma palavra sem sentido para doninha, especialmente com apenas 2 exemplos e sem estatísticas. Muitos projetos de software livre lançam um arquivo de projeto do VS como um gesto simbólico, suspeito que seja mais preciso. Mas se a experiência do passado é algo a se levar, o GCC ou o Clang geralmente são mais seguros, pois o VS tende a ficar consideravelmente para trás à medida que os padrões de linguagem evoluem.
Underscore_d

Essa é uma resposta de 2009. Atualmente, as coisas parecem ainda mais sombrias para o GCC. Quanto à "maioria", se você medir pelo impacto, apenas o Firefox e o Chrome terão mais usuários do que qualquer outra coisa.
Vartec 02/04

2
O que mudou desde que respondi é que agora clangé uma solução viável entre plataformas.
Vartec 02/04/19

9

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

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


É por isso que os ambientes totalmente compatíveis com MinGW, como o MSYS2, oferecem um Cygwin ou outra camada totalmente compatível com POSIX para as porcas e parafusos de baixo nível das cadeias de ferramentas necessárias durante a construção. Em seguida, a compilação e o vínculo reais são deixados para o compilador MinGW totalmente nativo. MSYS2 é realmente limpo.
Underscore_d

9

Para usar o Cygwin em um aplicativo comercial / proprietário / de código 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 da licença cygwin" e veja os primeiros resultados.

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

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


2
Uma atualização do site da Redhat (o link de "compra de licença" - 'A partir de 1º de março de 2016, a Red Hat não vende mais a licença de compra comercial para Cygwin. A licença comercial não é mais necessária porque o Cygwin agora está sendo distribuído sob o GNU Lesser GPL (LGPL). '> No site da Cygwin. A biblioteca da API Cygwin ™ encontrada no subdiretório winsup do código-fonte é coberta pela Licença Pública Geral Menor GNU (LGPL) versão 3 ou posterior. Para obter detalhes sobre os requisitos da LGPLv3, por favor leia a Licença Pública Geral Menor GNU (LGPL).
Izzy Helianthus

6

O Cygwin foi projetado para fornecer um ambiente POSIX mais ou menos completo para Windows, incluindo um extenso conjunto de ferramentas projetadas para fornecer uma plataforma completa do tipo Linux. Em comparação, o MinGW e o MSYS fornecem uma camada leve e minimalista do tipo POSIX, com apenas as ferramentas mais essenciais gcce bashdisponíveis. Devido à abordagem mais minimalista do MinGW, ele não fornece o grau de cobertura da API POSIX que o Cygwin oferece e, portanto, não pode criar certos programas que poderiam ser compilados no Cygwin.

Em termos do código gerado pelos dois, a cadeia de ferramentas Cygwin depende de links dinâmicos para uma grande biblioteca de tempo de execução cygwin1.dll, enquanto a cadeia de ferramentas MinGW compila código para binários que se vinculam dinamicamente à biblioteca C nativa do Windows msvcrt.dlle estaticamente a partes de 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 de forma independente, mas tendem a ser maiores.

O fato de os programas baseados no 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 cabeçalhos e as bibliotecas são permissivamente licenciados.


3

Cygwin is é um ambiente semelhante ao Unix e uma interface de linha de comando para o Microsoft Windows.

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

Você pode executar binários gerados mingwsem o cygwinambiente, desde que todas as DLLs (bibliotecas necessárias) estejam presentes.


1

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.