¿Cómo compilar para Windows en Linux con gcc / g ++?

119

He escrito algunos efectos en C ++ (g ++) usando freeglut en Linux, y los compilo con

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

Entonces, me preguntaba si es posible hacer que g ++ cree ejecutables de Windows compilados estáticos que contengan todo lo necesario.

No tengo Windows, así que sería genial si pudiera hacer eso en Linux :)

Louise
fuente
4
@AndiDog, "Primera dosis gratis", correcto. De todos modos, no es necesario configurar un proceso de compilación automatizado en una máquina con Windows, mientras tiene uno completo y en funcionamiento para Linux.
P Shved el
¿Cómo probaría su software de Windows sin Windows? ¿Estás usando vino?
el.pescado
7
@ el.pescado, construir y probar son tareas completamente diferentes. Windows es innecesario para el primero.
P Shved el

Respuestas:

92

mingw32 existe como paquete para Linux. Puede compilar y vincular aplicaciones de Windows con él. Hay un tutorial aquí en el foro Code :: Blocks . Tenga en cuenta que el comando cambia a x86_64-w64-mingw32-gcc-win32, por ejemplo.

Ubuntu, por ejemplo, tiene MinGW en sus repositorios:

$ 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
fuente
3
Si usa debian, mingw32 ya está en el repositorio, junto con algunas bibliotecas precompiladas también.
liori
1
Bueno, hay un entorno de compilación cruzada en nongnu.org/mingw-cross-env . Incluye freeglut, por ejemplo. Pero no lo he usado, así que no me preguntes al respecto;)
AndiDog
4
¿El "32" en mingw32 significa que solo puedo producir un binario de 32 bits? ¿Existe una solución para producir un binario de 64 bits también?
bluenote10
1
bluenote10: hay variantes que se compilan para x64, como "x86_64-w64-mingw32-g ++". La base "mingw32" puede o no ser capaz, pero es bastante fácil instalar / usar las variantes por su nombre. ar2015: ¿No es compatible con C ++ 11 en absoluto o está hablando de un problema que tuvo con él? Estoy trabajando para construir un proyecto con mingw mientras hablamos y sería una buena información saberlo. Otros hilos indican que sí es compatible con c ++ 11 (por ejemplo, stackoverflow.com/questions/16136142/… ). Por supuesto que estaría feliz de ayudar, pero una publicación separada sería mejor para eso.
John P
1
¿Han cambiado las cosas sobre estos temas recientemente?
Montreal
30

Una opción de compilación para Windows en Linux es a través de mingw. Encontré un tutorial muy útil aquí. .

Para instalar mingw32 en sistemas basados ​​en Debian, ejecute el siguiente comando:
sudo apt-get install mingw32

Para compilar su código, puede usar algo como:
i586-mingw32msvc-g++ -o myApp.exe myApp.cpp

A veces, querrá probar la nueva aplicación de Windows directamente en Linux. Puedes usar vino para eso, aunque siempre debes tener en cuenta que el vino puede tener errores. Esto significa que es posible que no esté seguro de que haya un error en wine, en su programa o en ambos, por lo que solo use wine para pruebas generales.

Para instalar vino, ejecute:
sudo apt-get install wine

agregado1166877
fuente
7
no es necesario especificar mingw32-binutilsy mingw32-runtimeporque son dependencias demingw32
henje
genial, el cpp tenía errores muy simples ( void main(){}etc ...), supongo que se compila en Windows pero falla en mingw, los arreglé. Intenté también i586-mingw32msvc-cppy generó un archivo de texto con algo así como cosas para ser compiladas jajaja ... el g ++ funcionó, ¡gracias!
Aquarius Power
2
@henje para ser minucioso, si no los especifica, el administrador de paquetes puede eliminarlos automáticamente al desinstalarlos mingw32(marcados como "dependencias". Si los especifica, no lo harán (marcados como "manual").
Matthieu
19

El método sugerido me dio un error en Ubuntu 16.04: E: No se pudo ubicar el paquete mingw32

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

Para instalar este paquete en Ubuntu, utilice lo siguiente:

sudo apt-get install mingw-w64

Después de la instalación, puede usarlo:

x86_64-w64-mingw32-g++

¡Tenga en cuenta!

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

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

0x8BADF00D
fuente
14

Instale un compilador cruzado, como mingw64 desde su administrador de paquetes. Luego compile de la siguiente manera: en lugar de simplemente llamar a gcccall i686-w64-mingw32-gccpara Windows de 32 bits o x86_64-w64-mingw32-gcc"para Windows de 64 bits. También usaría el--static opción, ya que es posible que el sistema de destino no tenga todas las bibliotecas.

Si desea compilar otro lenguaje, como Fortran, reemplace -gcccon -gfortranen los comandos anteriores.

Pedro Miranda
fuente
7

He usado mingw en Linux para hacer ejecutables de Windows en C, sospecho que C ++ también funcionaría.

Tengo un proyecto, ELLCC, que empaqueta clang y otras cosas como una cadena de herramientas de compilación cruzada. Lo uso para compilar clang (C ++), binutils y GDB para Windows. Siga el enlace de descarga en ellcc.org para obtener binarios precompilados para varios hosts Linux.

Richard Pennington
fuente
1
Desde que publiqué esa respuesta, he ido un poco más lejos. Tengo un proyecto, ELLCC, que empaqueta clang y otras cosas como una cadena de herramientas de compilación cruzada. Lo uso para compilar clang (C ++), binutils y GDB para Windows. Siga el enlace de descarga en ellcc.org para obtener binarios precompilados para varios hosts Linux.
Richard Pennington
5

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

A partir de Fedora 17, es posible construir fácilmente (compilación cruzada) binarios para los destinos win32 y win64. Esto se realiza utilizando la cadena de herramientas mingw-w64: http://mingw-w64.sf.net/ . El uso de esta cadena de herramientas le permite crear binarios para los siguientes lenguajes de programación: C, C ++, Objective-C, Objective-C ++ y Fortran.

"Consejos y trucos para usar el compilador cruzado de Windows": https://fedoraproject.org/wiki/MinGW/Tips

iljau
fuente
3

para Fedora es

sudo yum groupinstall -y "MinGW cross-compiler"
carroñero
fuente
1
Para todos esos usuarios de Fedora: hay un gran tutorial aquí: fedoraproject.org/wiki/MinGW (editado porque enlace incorrecto)
LemurPwned
¡Exactamente lo que estaba buscando! Funciona con sudo dnf groupinstall ...también.