Como compilar para Windows no Linux com gcc / g ++?

119

Escrevi alguns efeitos em C ++ (g ++) usando freeglut no Linux e os compilo com

g++ -Wall -lglut part8.cpp -o part8

Então, eu queria saber se é possível fazer com que o g ++ crie executáveis ​​compilados estáticos do Windows que contenham tudo o que é necessário.

Não tenho Windows, então seria muito legal se eu pudesse fazer isso no Linux :)

Louise
fonte
4
@AndiDog, "Primeira dose de graça", certo. De qualquer forma, configurar um processo de construção automatizado em uma máquina Windows, enquanto você tem um completo e funcionando para Linux, é desnecessário.
P Shved
Como você testaria seu software Windows sem o Windows? Usando Wine?
el.pescado
7
@ el.pescado, construir e testar são tarefas completamente diferentes. O Windows é desnecessário para o primeiro.
P Shved

Respostas:

92

mingw32 existe como um pacote para Linux. Você pode compilar e vincular aplicativos do Windows a ele. Há um tutorial aqui no fórum Code :: Blocks . Lembre-se de que o comando muda para x86_64-w64-mingw32-gcc-win32, por exemplo.

Ubuntu, por exemplo, tem MinGW em seus repositórios:

$ apt-cache search mingw
[...]
g++-mingw-w64 - GNU C++ compiler for MinGW-w64
gcc-mingw-w64 - GNU C compiler for MinGW-w64
mingw-w64 - Development environment targeting 32- and 64-bit Windows
[...]
AndiDog
fonte
3
Se você usa debian, mingw32 já está no repositório, junto com algumas bibliotecas pré-compiladas também.
liori
1
Bem, há um ambiente de compilação cruzada em nongnu.org/mingw-cross-env . Inclui freeglut, por exemplo. Mas eu não usei isso, então não me pergunte sobre isso;)
AndiDog
4
O "32" em mingw32 significa que só posso produzir um binário de 32 bits? Existe uma solução para produzir um binário de 64 bits também?
bluenote10
1
bluenote10: existem variantes criadas para x64, como "x86_64-w64-mingw32-g ++". O "mingw32" básico pode ou não ser capaz, mas é fácil instalar / usar as variantes pelo nome. ar2015: Ele não oferece suporte a C ++ 11 ou você está falando sobre um problema que teve com ele? Estou trabalhando para conseguir um projeto para construir com o mingw neste momento e essa seria uma boa informação de se saber. Outros tópicos indicam que ele suporta c ++ 11 (por exemplo, stackoverflow.com/questions/16136142/… ). Claro, eu ficaria feliz em ajudar, mas uma postagem separada seria melhor para isso.
John P
1
As coisas neste tópico mudaram recentemente?
Montreal
30

Uma opção de compilar para Windows no Linux é via mingw. Eu encontrei um tutorial muito útil aqui .

Para instalar o mingw32 em sistemas baseados em Debian, execute o seguinte comando:
sudo apt-get install mingw32

Para compilar seu código, você pode usar algo como:
i586-mingw32msvc-g++ -o myApp.exe myApp.cpp

Às vezes, você desejará testar o novo aplicativo do Windows diretamente no Linux. Você pode usar vinho para isso, embora deva sempre ter em mente que o vinho pode ter insetos. Isso significa que você pode não ter certeza se um bug está no wine, no seu programa ou em ambos, então use o wine apenas para testes gerais.

Para instalar o Wine, execute:
sudo apt-get install wine

agregado1166877
fonte
7
você não precisa especificar mingw32-binutilse mingw32-runtimeporque são dependências demingw32
henje
legal, o cpp tinha erros muito simples ( void main(){}etc ...), acho que compila no windows mas falha no mingw, corrigi-los. Tentei também i586-mingw32msvc-cppe gerou um arquivo texto com algo parecido com coisas para serem compiladas rs .. o do g ++ funcionou, thx!
Aquarius Power
2
@henje para ser completo, se você não especificá-los, eles podem ser removidos automaticamente pelo gerenciador de pacotes durante a desinstalação mingw32(marcados como "dependências". Se você especificá-los, eles não irão (marcados como "manuais").
Matthieu
19

O método sugerido me deu um erro no Ubuntu 16.04: E: Não é possível localizar o pacote mingw32

========================================================== ===========================

Para instalar este pacote no Ubuntu, use o seguinte:

sudo apt-get install mingw-w64

Após a instalação, você pode usá-lo:

x86_64-w64-mingw32-g++

Observe!

Para uso de 64 bits: x86_64-w64-mingw32-g ++

Para uso de 32 bits: i686-w64-mingw32-g ++

0x8BADF00D
fonte
14

Instale um compilador cruzado, como o mingw64 do seu gerenciador de pacotes. Em seguida, compile da seguinte maneira: em vez de simplesmente chamar gcccall i686-w64-mingw32-gccpara Windows de 32 bits ou x86_64-w64-mingw32-gcc"para Windows de 64 bits. Eu também usaria a --staticopção, pois o sistema de destino pode não ter todas as bibliotecas.

Se você deseja compilar outra linguagem, como Fortran, substitua -gccpor -gfortrannos comandos anteriores.

Pedro Miranda
fonte
7

Usei o mingw no Linux para fazer executáveis ​​do Windows em C, e suspeito que C ++ também funcionaria.

Tenho um projeto, ELLCC, que empacota clang e outras coisas como uma cadeia de ferramentas de compilador cruzado. Eu o uso para compilar o clang (C ++), binutils e GDB para Windows. Siga o link de download em ellcc.org para binários pré-compilados para vários hosts Linux.

Richard Pennington
fonte
1
Desde que postei essa resposta, fui um pouco mais longe. Eu tenho um projeto, ELLCC, que empacota clang e outras coisas como uma cadeia de ferramentas de compilador cruzado. Eu o uso para compilar o clang (C ++), binutils e GDB para Windows. Siga o link de download em ellcc.org para binários pré-compilados para vários hosts Linux.
Richard Pennington
5

De: https://fedoraproject.org/wiki/MinGW/Tutorial

A partir do Fedora 17, é possível construir facilmente (compilação cruzada) binários para os destinos win32 e win64. Isso é realizado usando o conjunto de ferramentas mingw-w64: http://mingw-w64.sf.net/ . O uso dessa cadeia de ferramentas permite que você crie binários para as seguintes linguagens de programação: C, C ++, Objective-C, Objective-C ++ e Fortran.

"Dicas e truques para usar o compilador cruzado do Windows": https://fedoraproject.org/wiki/MinGW/Tips

iljau
fonte
3

para o Fedora é

sudo yum groupinstall -y "MinGW cross-compiler"
Carniceiro
fonte
1
Para todos os usuários do Fedora: há um ótimo tutorial aqui: fedoraproject.org/wiki/MinGW (editado porque link errado)
LemurPwned em
Exatamente o que eu estava procurando! Funciona com sudo dnf groupinstall ...também.