Pergunta

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

Outra pergunta é se eu vou ser capaz de executar o binário em um sistema sem Cygwin / MinGW?

Foi útil?

Solução

Como simplificação, é assim:

  • Compilar algo em Cygwin e você está compilando-o para Cygwin .

  • Compilar algo em MinGW e você está compilando-o para Windows .

Sobre Cygwin

O objetivo do Cygwin é fazer portar aplicativos baseados em Unix para o Windows muito mais fácil, emulando muitos dos pequenos detalhes que Unix baseado em sistemas operacionais oferecem, e são documentadas pelo padrões POSIX . Seu aplicativo pode usar o recurso de Unix, tais como tubos, arquivo Unix-style e acesso ao diretório, e assim por diante, e ele pode ser compilado com Cygwin que funcionará como um camada de compatibilidade em torno de sua aplicação, de modo que muitos daqueles Unix específicas de paradigmas pode continuar a ser utilizado.

Quando você distribuir seu software, o destinatário precisará executá-lo juntamente com o ambiente de tempo de execução Cygwin (fornecido pelo cygwin1.dll arquivo). Você pode distribuir com o seu software, mas seu software terão de cumprir com a sua licença de código aberto. Pode até ser o caso que mesmo apenas ligar o seu software com ele, mas distribuir a dll separadamente, podem ainda requerem que você honrar a licença de código aberto.

Sobre MinGW

MinGW pretende ser simplesmente uma porta do Windows das ferramentas do compilador GNU, tais como gcc, make, Bash, e assim por diante. Ele não tenta imitar ou fornecer compatibilidade completa com o Unix, mas em vez disso, fornece o ambiente mínimo necessário para uso GCC (o compilador GNU) e um pequeno número de outras ferramentas no Windows . Ele não tem uma camada de emulação de Unix como Cygwin, mas como resultado suas necessidades de aplicação para ser especificamente programado para ser capaz de executar no Windows, o que pode significar alteração significativa se ele foi criado a confiar em que está sendo executado em um ambiente padrão Unix e utiliza recursos específicos do Unix como os mencionados anteriormente. Por padrão, o código compilado no GCC do MinGW irá compilar a um alvo nativo do Windows X86, incluindo arquivos .exe e .dll, embora você também pode cross-compilação com as configurações corretas, uma vez que são basicamente utilizando o GNU suíte ferramentas do compilador.

MinGW é essencialmente uma alternativa para o Microsoft Visual C ++ compilador e sua associada ligando / fazer ferramentas. Pode ser possível em alguns casos, usar MinGW para compilar algo que foi destinado para compilar com Microsoft Visual C ++, com as bibliotecas corretas e, em alguns casos com outras modificações.

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

Para aplicações de software não-triviais, tornando-cross-plataforma pode ser um desafio considerável menos que você use um quadro multi-plataforma abrangente. Na época, eu escrevi este o Qt quadro foi um dos mais populares para esta finalidade , permitindo a construção de aplicações gráficas que funcionam em vários sistemas operacionais, incluindo Windows, mas existem outras opções também. Se você usar o framework de tal desde o início, você pode não só reduzir suas dores de cabeça quando chega a hora de porta para outra plataforma, mas você pode usar os mesmos widgets de gráficos - janelas, menus e controles - em todas as plataformas Se você estiver escrevendo um GUI aplicativo, e tê-los aparecer nativa para o usuário.

Outras dicas

Cygwin é uma tentativa de criar um ambiente completo UNIX / POSIX no Windows. Para fazer isso ele usa várias DLLs. Embora essas DLLs são cobertos pela GPLv3 +, sua licença contém uma exceção que não force uma obra derivada de ser coberto pelo GPLv3 +. MinGW é um C / C ++ suíte compilador que permite criar executáveis ??do Windows, sem dependência de tais DLLs -. Você só precisa os tempos de execução normais MSVC, que fazem parte de qualquer instalação normal Microsoft Windows

Você também pode obter uma pequena UNIX / POSIX como o ambiente, compilado com MinGW chamado MSYS . Ele não tem em qualquer lugar perto de todas as características de Cygwin, mas é ideal para programadores que querem usar MinGW.

Para adicionar outras respostas, Cygwin vem com as bibliotecas e cabeçalhos MinGW e você pode compilar sem ligando para o cygwin1.dll usando o sinalizador de -mno-cygwin com gcc. Eu prefiro muito esta a usar plain MinGW e MSYS.

Wikipedia faz uma comparação aqui .

A partir do Cygwin website :

  • Cygwin é um ambiente semelhante ao Linux para Windows. Ele consiste de duas partes:. A DLL (cygwin1.dll) que funciona como uma camada de emulação API Linux fornecendo funcionalidade API substancial Linux
  • Uma coleção de ferramentas que fornecem Linux look and feel.

A partir de Mingw website :

MinGW ( "Minimalistic GNU para Windows") é uma coleção de arquivos de cabeçalho específicos disponíveis gratuitamente e livremente distribuíveis do Windows e bibliotecas de importação combinadas com conjuntos de ferramentas GNU que permitem produzir programas nativos do Windows que não dependem de qualquer 3rd-party C runtime DLLs

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

MinGW compila para um aplicativo nativo Win32.

Se você construir algo com Cygwin, qualquer sistema que você instalá-lo para também terão a DLL Cygwin (s). Uma aplicação 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 # 1: Eu quero criar um aplicativo que eu escrevo código fonte uma vez, compilá-lo uma vez e executá-lo em qualquer plataforma (por exemplo, Windows, Linux e Mac OS X ...)

.

Resposta # 1: Escreva o seu código-fonte em JAVA. Compilar o código fonte de uma vez executá-lo 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 quaisquer plataformas separadamente (por exemplo, Windows, Linux e Mac OS X ...)

.

Resposta # 2: Escreva o seu código-fonte em C ou C ++. Usar arquivos de cabeçalho padrão só. Use um compilador adequado para qualquer plataforma (por exemplo, para o Visual Studio Do Windows, GCC para Linux e XCode para Mac). Nota que você não deve usar qualquer programação avançada apresenta a compilar o código fonte em todos plataformas com sucesso. Se você usar Nenhum C ou C ++ ou padrão classes funções, o seu código fonte não faz compilar em outras plataformas.


Pergunta # 3:? Na resposta da pergunta nº 2, é difícil usando o compilador diferente para cada plataforma, existe algum compilador multiplataforma

Resposta # 3: Sim, compilador Use GCC. isto é um compilador plataforma transversal. Para compilar o código fonte no Windows uso MinGW que fornece compilador GCC para Windows e compila sua fonte código para o programa Windows nativo. Não utilizar qualquer das funções de programação avançadas (Como Windows API) para compilar seu código-fonte em todas as plataformas com sucesso. Se você usa o Windows API funções, o seu código fonte não faz compilar em outras plataformas.


Pergunta # 4: C ou arquivos de cabeçalho padrão C ++ não fornecem qualquer tipo de programação recursos avançados como multi-threading. O que posso fazer?

Resposta # 4: Você deve usar POSIX (Operating System Interface portátil [Para UNIX]) padrão. Ele fornece muitos recursos avançados de programação e Ferramentas. Muitos sistemas operacionais totalmente ou em parte POSIX compatível (como o Mac OS X, Solaris, BSD / OS e ...). Alguns sistemas durante a operação não oficialmente certificado como POSIX compatível, em conformidade em grande parte (como Linux, FreeBSD, OpenSolaris e ...). Cygwin fornece um desenvolvimento em grande parte compatível com POSIX e ambiente de tempo de execução para Microsoft Do Windows.


Assim:

Para usar vantagem de compilador GCC plataforma cruzada no Windows, usar MinGW.

Para usar vantagem de POSIX padrão recursos de programação e ferramentas avançado em Windows, utilize Cygwin.

Wikipedia diz :

MinGW bifurcada a partir da versão 1.3.3 do Cygwin. Embora ambos Cygwin e MinGW pode ser usado para software porta UNIX para Windows, eles têm abordagens diferentes: objetivos Cygwin para fornecer uma POSIX layer completa que fornece emulações de várias chamadas e bibliotecas do sistema que existem em Linux, UNIX, eo BSD variantes. o POSIX layer roda em cima do Windows, sacrificar o desempenho, onde necessárias para a compatibilidade. Por conseguinte, esta abordagem exige programas Windows escritos com Cygwin para rodar em cima de um copyleft biblioteca de compatibilidade que deve ser distribuído com o programa, juntamente com source code do programa. objetivos MinGW para fornecer nativa funcionalidade e desempenho através Windows API calls directa. Ao contrário Cygwin, MinGW não requer uma DLL camada de compatibilidade e Assim, os programas não precisam ser distribuídos com source code.

Porque MinGW depende Windows API calls, não pode fornecer um POSIX API completo; ele é incapaz de compilar alguns UNIX applications que pode ser compilado com Cygwin. Especificamente, esta aplica-se a aplicações que exigem funcionalidade POSIX como fork(), mmap() ou ioctl() e aqueles que esperam para ser executado em um POSIX environment. Os aplicativos escritos usando um cross-platform library que tem em si foi portado para MinGW, como SDL, wxWidgets, Qt, ou GTK+, normalmente irá compilar como facilmente em MinGW como se estivessem em Cygwin.

A combinação de MinGW e MSYS fornece uma pequena, auto-suficiente ambiente que pode ser carregado em meios removíveis sem sair entradas no registro ou arquivos no computador. Cygwin portátil fornece uma funcionalidade semelhante. Ao fornecer mais funcionalidades, Cygwin se torna mais complicado de instalar e manter.

Também é possível cross-compile Windows applications com MinGW-GCC under POSIX systems. Isso significa que os desenvolvedores não precisa de uma instalação do Windows com MSYS de software de compilação que a vontade executado em Windows sem Cygwin.

Do ponto de vista de 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 Microsoft Visual C. Nós também pode compilar este programa com MinGW, e com o Cygwin.

De acordo com Microsoft Visual C, o programa será ligado a um redistributable biblioteca de tempo de execução MSVC: mxvcrtnn.dll, onde nn algum sufixo versão. Para enviar este programa, teremos de incluir essa DLL. Essa DLL fornece _stat, system e printf. (Temos também a opção de vincular estaticamente o tempo de execução.)

De acordo com MinGW, o programa será ligado ao msvcrt.dll, que é uma situação irregular biblioteca unversioned interna, que faz parte do Windows, e fora dos limites para uso do aplicativo. Essa biblioteca é, essencialmente, um garfo da biblioteca de tempo de execução redistribuível do MS Visual C para uso pelo próprio Windows.

De acordo com ambos, o programa terá comportamentos semelhantes:

  • a função stat retornará informações-não muito limitado número de permissões úteis ou inode, por exemplo.
  • o c:file.txt caminho é resolvido de acordo com o atual diretório de trabalho associado com c: unidade.
  • usos system cmd.exe /c para executar o comando externo.

Nós também pode compilar o programa sob Cygwin. Da mesma forma que o tempo de execução redistribuível usado pelo MS Visual C, o programa Cygwin será ligado a bibliotecas run-time do Cygwin: cygwin1.dll (Cygwin adequada) e cyggcc_s-1.dll (GCC suporte de tempo de execução). Desde Cygwin está agora sob a LGPL, podemos embalar com o nosso programa, mesmo que ele não é um software livre compatível com a GPL, e enviar o programa.

De acordo com Cygwin, as funções de biblioteca irá se comportar de forma diferente:

  • a função stat tem a funcionalidade rica, retornando valores significativos na maioria dos campos.
  • a c:file.txt caminho não é compreendido em todos como contendo uma referência letra de unidade, uma vez que c: não é seguido por uma barra. O cólon é considerado parte do nome e de alguma forma mutilado para ele. Não existe o conceito de um caminho relativo contra um volume ou uma unidade em Cygwin, nenhum conceito "atualmente conectado drive", e não por unidade do diretório de trabalho atual.
  • a função system tenta usar o intérprete /bin/sh -c. Cygwin vai resolver o caminho / de acordo com a localização do seu executável, e esperar que um programa sh.exe a ser co-localizado com o seu executável.

Ambos Cygwin e MinGW permitem que você use funções Win32. Se você quiser MessageBox chamada ou CreateProcess, você pode fazer isso. Você também pode facilmente construir um programa que não exige uma janela do console, usando gcc -mwindows, sob 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 Microsoft C (material encontrado em msvcrt.dll ou o msvcrtnn.dll re-distribuível tempos de execução). Um exemplo disso são a família spawn* de funções como spawnvp. Estes são uma boa idéia para usar em vez de fork e exec em Cygwin, uma vez que mapear melhor o modelo de criação de processos do Windows que não tem nenhum conceito de fork.

Assim:

  • programas Cygwin não são menos "nativo" do que os programas MS Visual C por razões de exigir o acompanhamento de bibliotecas. Programação implementações de linguagem no Windows são esperados para fornecer seu próprio tempo de execução, mesmo implementações de linguagem C. Não há "libc" no Windows para uso público.

  • O fato de que MinGW não requer DLL de terceiros é na verdade um disadvantage; ele está dependendo de um garfo em situação irregular, o Windows-interno do Visual C run-time. MinGW faz isso porque a exceção biblioteca do sistema GPL se aplica a msvcrt.dll, o que significa que os programas GPL-ed podem ser compiladas e redistribuídos com MinGW.

  • Devido à sua muito apoio mais amplo e profundo para POSIX comparação com msvcrt.dll, Cygwin é de longe o ambiente superior para portar programas POSIX. Uma vez que é agora sob a LGPL, permite aplicações com todos os tipos de licenças, de código aberto ou fechado, para ser redistribuído. Cygwin mesmo contém emulação VT100 e termios, que trabalha com a consola Microsoft! Uma aplicação POSIX que configura modo bruto com tcsetattr e usos VT100 códigos para controlar o cursor vai funcionar direito na janela de cmd.exe. Tanto quanto o usuário final está em causa, é um console app nativo fazer chamadas Win32 para controlar o console.

No entanto:

  • Como uma ferramenta de desenvolvimento nativo do Windows, Cygwin tem algumas peculiaridades, como o manuseio caminho que é estranho para o Windows, a dependência de alguns caminhos embutidos como /bin/sh e outras questões. Estas diferenças são o que tornam os programas Cygwin "não-nativos". Se um programa tem um caminho como argumento, ou a entrada de uma caixa de diálogo, os usuários do Windows esperam que o caminho para trabalhar da mesma forma como faz em outros programas do Windows. Se ele não funciona dessa maneira, isso é um problema.

Plug: Pouco depois do anúncio LGPL, comecei a Cygnal projeto (Biblioteca Aplicação Cygwin nativo) para fornecer um garfo do Cygwin DLL que visa corrigir esses problemas. Os programas podem ser desenvolvidos sob Cygwin, e em seguida implantado com a versão Cygnal de cygwin1.dll sem recompilar. Como esta biblioteca melhora, ele irá eliminar gradualmente a necessidade de MinGW.

Quando Cygnal resolve o problema manuseio caminho, será possível desenvolver um único executável que trabalha com caminhos do Windows, quando expedidos como um aplicativo do Windows com Cygnal, e funciona perfeitamente com caminhos Cygwin quando instalado em sua /usr/bin sob Cygwin. Sob Cygwin, o executável será transparente trabalhar com um caminho como /cygdrive/c/Users/bob. Na implantação nativa onde está ligando contra a versão Cygnal de cygwin1.dll, esse caminho não fará sentido, enquanto ele vai entender c:foo.txt.

Não se esqueçam U / Win software da AT & T, que é projetado para ajudar a compilar aplicações Unix no Windows. (última versão - 2012-08-06; usa Eclipse Public License, versão 1.0)

Como Cygwin eles têm que correr contra uma biblioteca; no seu caso POSIX.DLL. Os caras da AT & T são engenheiros fantásticos (mesmo grupo que você ksh e dot trazido) e suas coisas vale a pena conferir.

Cygwin emula todo o ambiente POSIX, enquanto MinGW é conjunto de ferramentas mínimas para a compilação somente (compila a aplicação Win nativa.) Então, se você quiser fazer o seu projeto multi-plataforma a escolha entre os dois é óbvio, MinGW.

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

Para usar Cygwin em um application / proprietário /-fonte não aberto comercial, você terá que desembolsar dezenas de milhares de dólares para um " licença buyout " da Red Hat; Isso invalida os termos de licenciamento padrão a um custo considerável. Google "cygwin custo de licença" e ver o primeiro poucos resultados.

Para mingw, nenhum tal custo é incorrido, e as licenças (PD, BSD, MIT) são extremamente permissiva. No máximo você pode ser esperado para detalhes da licença de fornecimento com a sua aplicação, tal como os winpthreads licença necessária quando se utiliza mingw64-TDM.

Editar graças a Izzy Helianthus: A licença comercial não está mais disponível ou necessário porque a biblioteca API encontrado no subdiretório winsup de Cygwin agora está sendo distribuído sob a LGPL, ao contrário do GPL completo.

Note-se que o comportamento de utilidade pode realmente variar entre os dois.

Por exemplo, Cygwin tar pode bifurcar - porque garfo) é suportado (no DLL - onde a versão mingw não pode. Este é um problema quando se tenta mysql compilação de fonte.

Cygwin é projetado para fornecer um ambiente mais ou menos completa POSIX para Windows, incluindo um extenso conjunto de ferramentas projetado para fornecer um pleno direito Linux-like plataforma. Em comparação, MinGW e MSYS fornecer uma leve e minimalista POSIX-like camada, com apenas as ferramentas mais essenciais, como gcc e bash disponível. Por causa da abordagem mais minimalista do MinGW, ele não fornece o grau de cobertura API POSIX Cygwin ofertas e, portanto, não pode construir determinados programas que de outra forma pode ser compilados em Cygwin.

Em termos de código gerado pelos dois, o conjunto de ferramentas Cygwin confia na dinâmica que liga a uma grande biblioteca de tempo de execução, cygwin1.dll, enquanto o código toolchain compila MinGW para binários que apontam dinamicamente para Windows msvcrt.dll biblioteca C nativa, bem como estaticamente às partes de glibc. Cygwin executáveis ??são, portanto, mais compacto, mas exigem uma DLL redistribuível separado, enquanto binários MinGW pode ser enviado autônomo, mas tendem a ser maiores.

O fato de que programas baseados no Cygwin exigem uma DLL separada para executar também leva a restrições de licenciamento. A biblioteca de tempo de execução Cygwin está licenciado sob a GPLv3 com uma exceção ligando para aplicações com licenças OSI compatíveis, para que os desenvolvedores que desejam criar um aplicativo de código fechado em torno Cygwin deve adquirir uma licença comercial da Red Hat. Por outro lado, o código MinGW pode ser utilizado tanto em aplicações de fonte aberta e fechada de código, como os cabeçalhos e bibliotecas são permissivamente licenciado.

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

 enter descrição da imagem aqui

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

Mingw é uma porta de software nativo do GNU Compiler Collection (GCC) para Microsoft Windows , juntamente com um conjunto de bibliotecas de importação livremente distribuível e arquivos de cabeçalho para a API do Windows. MinGW permite aos desenvolvedores criar aplicações nativas do Microsoft Windows.

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

Cygwin utiliza uma camada de compatibilidade, enquanto MinGW é nativa. Essa é uma das principais diferenças.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top