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?
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.
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.
fonte
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.
fonte
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
pacote Cygwin. O MinGW-64 estará disponível como ox86_64-w64-mingw32-gcc
comando desajeitado . Por favor Deus, alguém já unifica os nomes dessas coisas sangrentas.A Wikipedia faz uma comparação aqui .
No site da Cygwin :
No site da Mingw :
fonte
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.
fonte
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…).
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…).
Pergunta 3: Em resposta à pergunta 2, é difícil usar um compilador diferente para cada plataforma. Existe algum compilador multiplataforma?
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?
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.
fonte
Do ponto de vista de como portar um programa C, uma boa maneira de entender isso é dar um exemplo:
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.No Microsoft Visual C, o programa será vinculado a uma biblioteca de tempo de execução redistribuível do MSVC:,
mxvcrtnn.dll
ondenn
há algum sufixo da versão. Para enviar este programa, teremos que incluir essa DLL. Essa DLL fornece_stat
,system
eprintf
. (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:
stat
função retornará informações muito limitadas - sem permissões úteis ou número de inode, por exemplo.c:file.txt
é resolvido de acordo com o diretório de trabalho atual associado à unidadec:
.system
usacmd.exe /c
para 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.dll
Cygwin : (próprio Cygwin) ecyggcc_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:
stat
função possui funcionalidade avançada, retornando valores significativos na maioria dos campos.c:file.txt
não é entendido como contendo uma referência de letra de unidade, poisc:
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.system
função tenta usar o/bin/sh -c
intérprete. O Cygwin resolverá o/
caminho de acordo com a localização do seu executável e espera que umsh.exe
programa 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
MessageBox
ouCreateProcess
, pode fazer isso. Você também pode criar facilmente um programa que não exija uma janela do console, usandogcc -mwindows
MinGW 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.dll
redistribuíveismsvcrtnn.dll
). Um exemplo disso é aspawn*
família de funções comospawnvp
. É uma boa idéia usar em vezfork
eexec
no Cygwin, pois eles mapeiam melhor o modelo de criação de processos do Windows que não tem nenhum conceitofork
.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 etermios
, que funcionam com o console da Microsoft! Um aplicativo POSIX que configura o modo bruto comtcsetattr
e usa códigos VT100 para controlar o cursor funcionará diretamente nacmd.exe
janela. No que diz respeito ao usuário final, é um aplicativo de console nativo que faz chamadas Win32 para controlar o console.Contudo:
/bin/sh
outros 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.dll
sem 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/bin
Cygwin. 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 Cygnalcygwin1.dll
, esse caminho não fará sentido, ao passo que entenderác:foo.txt
.fonte
Wikipedia diz :
fonte
apt-cyg
como talvez ainda mais fácil do que usar o apt no WSL.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.fonte
Outras respostas já atingiram o alvo. Eu só quero adicionar uma ilustração para uma captura rápida.
fonte
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).
fonte
clang
é uma solução viável entre plataformas.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.
fonte
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.
fonte
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
gcc
ebash
disponí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 Windowsmsvcrt.dll
e estaticamente a partes deglibc
. 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.
fonte
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
mingw
sem ocygwin
ambiente, desde que todas as DLLs (bibliotecas necessárias) estejam presentes.fonte
Cygwin
usa uma camada de compatibilidade, enquantoMinGW
é nativo. Essa é uma das principais diferenças.fonte