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?
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:
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.
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.
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
pacote Cygwin. O MinGW-64 estará disponível como o x86_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 :
- 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
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.
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:
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 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
onde nn
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 à unidade c:
.system
usa cmd.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) 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:
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, 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.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 um sh.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
ou CreateProcess
, pode fazer isso. Você também pode criar facilmente um programa que não exija uma janela do console, usando gcc -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íveis msvcrtnn.dll
). Um exemplo disso é a spawn*
família de funções como spawnvp
. É uma boa idéia usar em vez fork
e exec
no 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 tcsetattr
e usa códigos VT100 para controlar o cursor funcionará diretamente na cmd.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 Cygnal cygwin1.dll
, esse caminho não fará sentido, ao passo que entenderá c:foo.txt
.
MinGW
bifurcada da versão 1.3.3 deCygwin
. Embora ambosCygwin
eMinGW
pode ser usada para portarUNIX
software paraWindows
, eles têm abordagens diferentes:Cygwin
tem como objetivo fornecer uma solução completaPOSIX layer
que fornece emulações de várias chamadas do sistema e bibliotecas que existem noLinux
,UNIX
e asBSD
variantes. ÉPOSIX layer
executado em cimaWindows
, sacrificando o desempenho sempre que necessário para compatibilidade. Dessa forma, essa abordagem requer que osWindows
programas gravadosCygwin
sejam executados em cima de uma biblioteca de compatibilidade copyleft que deve ser distribuída com o programa, juntamente com a do programasource code
.MinGW
O objetivo é fornecer funcionalidade e desempenho nativos via diretaWindows API calls
. Ao contrárioCygwin
,MinGW
não requer uma camada de compatibilidadeDLL
e, portanto, os programas não precisam ser distribuídossource code
.Porque
MinGW
é dependenteWindows API calls
, não pode fornecer um totalPOSIX API
; é incapaz de compilar algunsUNIX applications
que podem ser compiladosCygwin
. Especificamente, isso se aplica a aplicativos que exigemPOSIX
funcionalidades comofork()
,mmap()
ouioctl()
e aqueles que esperam ser executados em umPOSIX environment
. Os aplicativos escritos usando umcross-platform library
que tem em si foi portado paraMinGW
, comoSDL
,wxWidgets
,Qt
, ouGTK+
, normalmente irá compilar como facilmente emMinGW
como fariam emCygwin
.A combinação
MinGW
eMSYS
fornece um ambiente pequeno e independente que pode ser carregado na mídia removível sem deixar entradas no registro ou arquivos no computador.Cygwin
Portátil oferece um recurso semelhante. Ao fornecer mais funcionalidade,Cygwin
fica mais complicado instalar e manter.Também é possível
cross-compile Windows applications
comMinGW-GCC under POSIX systems
. Isso significa que os desenvolvedores não precisam de uma instalação do WindowsMSYS
para compilar o software que será executadoWindows
semCygwin
.
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.
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).
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.
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.
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
e bash
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 Windows msvcrt.dll
e 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.
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 o cygwin
ambiente, desde que todas as DLLs (bibliotecas necessárias) estejam presentes.
Cygwin
usa uma camada de compatibilidade, enquanto MinGW
é nativo. Essa é uma das principais diferenças.