Otra forma de compilar software para Windows en Linux es la cadena de herramientas MinGW-w64 en Archlinux. Es fácil de usar y mantener, y proporciona versiones recientes del compilador y muchas bibliotecas. Personalmente, lo encuentro más fácil que MXE y parece que adopta versiones más nuevas de bibliotecas más rápido.
Primero, necesitará una máquina basada en arquitectura (la máquina virtual o el contenedor docker serán suficientes). No tiene que ser Arch Linux, los derivados también servirán. Usé Manjaro Linux. La mayoría de los paquetes MinGW-w64 no están disponibles en los repositorios oficiales de Arch, pero hay muchos en AUR. El administrador de paquetes predeterminado para Arch (Pacman) no admite la instalación directamente desde AUR, por lo que deberá instalar y usar un contenedor AUR como yay o yaourt. Luego, instalar la versión MinGW-w64 de las bibliotecas Qt5 y Boost es tan fácil como:
yay -Sy mingw-w64-qt5-base mingw-w64-boost
#yaourt -Sy mingw-w64-qt5-base mingw-w64-qt5-boost #if you use yaourt
Esto también instalará la cadena de herramientas MinGW-w64 (mingw-w64-gcc
) y otras dependencias. La compilación cruzada de un proyecto Qt para Windows (x64) es tan simple como:
x86_64-w64-mingw32-qmake-qt5
make
Para implementar su programa, deberá copiar los archivos DLL correspondientes de /usr/x86_64-w64-mingw32/bin/
. Por ejemplo, normalmente necesitará copiar /usr/x86_64-w64-mingw32/lib/qt/plugins/platforms/qwindows.dll
a program.exe_dir/platforms/qwindows.dll
.
Para obtener una versión de 32 bits, simplemente necesita usar i686-w64-mingw32-qmake-qt5
en cambio. Los proyectos basados en Cmake funcionan con la misma facilidad con x86_64-w64-mingw32-cmake
Este enfoque funcionó extremadamente bien para mí, fue el más fácil de configurar, mantener y ampliar. También va bien con los servicios de integración continua. También hay imágenes acoplables disponibles.
Por ejemplo, supongamos que quiero crear una GUI de descarga de subtítulos de QNapi. Podría hacerlo en dos pasos:
- Inicie el contenedor docker:
sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash
- Clonar y compilar QNapi
git clone --recursive 'https://github.com/QNapi/qnapi.git'
cd qnapi/
x86_64-w64-mingw32-qmake-qt5
make
¡Eso es todo! En muchos casos, será así de fácil. Agregar sus propias bibliotecas al repositorio de paquetes (AUR) también es sencillo. Necesitará escribir un archivo PKBUILD, que es lo más intuitivo posible, vea mingw-w64-rapidjson, por ejemplo.
(Esta es una actualización de la respuesta de @Tshepang, ya que MXE ha evolucionado desde su respuesta)
Construyendo Qt
En lugar de usar make qt
para construir Qt, puedes usar MXE_TARGETS
para controlar la máquina y la cadena de herramientas de destino (32 o 64 bits). MXE comenzó a usar .static
y .shared
como parte del nombre de destino para mostrar qué tipo de biblioteca desea compilar.
# The following is the same as `make qt`, see explanation on default settings after the code block.
make qt MXE_TARGETS=i686-w64-mingw32.static # MinGW-w64, 32-bit, static libs
# Other targets you can use:
make qt MXE_TARGETS=x86_64-w64-mingw32.static # MinGW-w64, 64-bit, static libs
make qt MXE_TARGETS=i686-w64-mingw32.shared # MinGW-w64, 32-bit, shared libs
# You can even specify two targets, and they are built in one run:
# (And that's why it is MXE_TARGET**S**, not MXE_TARGET ;)
# MinGW-w64, both 32- and 64-bit, static libs
make qt MXE_TARGETS='i686-w64-mingw32.static x86_64-w64-mingw32.static'
En la respuesta original de @Tshepang, no especificó un MXE_TARGETS
y se utiliza el valor predeterminado. En el momento en que escribió su respuesta, el valor predeterminado era i686-pc-mingw32
, ahora es i686-w64-mingw32.static
. Si establece explícitamente MXE_TARGETS
a i686-w64-mingw32
, omitiendo .static
, se imprime una advertencia porque esta sintaxis ahora está en desuso. Si intenta establecer el objetivo en i686-pc-mingw32
, mostrará un error ya que MXE ha eliminado la compatibilidad con MinGW.org (es decir, i686-pc-mingw32).
Ejecutando qmake
Como cambiamos el MXE_TARGETS
, el <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake
el comando ya no funcionará. Ahora, lo que tienes que hacer es:
<mxe root>/usr/<TARGET>/qt/bin/qmake
Si no especificaste MXE_TARGETS
, haz esto:
<mxe root>/usr/i686-w64-mingw32.static/qt/bin/qmake
Actualización: El nuevo valor predeterminado ahora es i686-w64-mingw32.static
Simplemente use el entorno cruzado M (MXE). Elimina el dolor de todo el proceso:
-
Consíguelo:
$ git clone https://github.com/mxe/mxe.git
-
Instalar dependencias de compilación
-
Compile Qt para Windows, sus dependencias y las herramientas de compilación cruzada; esto llevará aproximadamente una hora en una máquina rápida con acceso a Internet decente; la descarga es de aproximadamente 500 MB:
$ cd mxe && make qt
-
Vaya al directorio de su aplicación y agregue las herramientas de compilación cruzada a la RUTA variable de entorno:
$ export PATH=<mxe root>/usr/bin:$PATH
-
Ejecute la herramienta generadora Qt Makefile y luego cree:
$ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
-
Debería encontrar el binario en el directorio ./release:
$ wine release/foo.exe
Algunas notas :
-
Use la rama maestra del repositorio MXE; parece recibir mucho más amor del equipo de desarrollo.
-
La salida es un binario estático de 32 bits, que funcionará bien en Windows de 64 bits.
Bien, creo que lo tengo resuelto.
Basado en parte en https://github.com/mxe/mxe/blob/master/src/qt.mk y https://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak
Parece que "inicialmente" cuando ejecuta configure (con -xtarget, etc.), configura y luego ejecuta sus "hosts" gcc para construir el archivo binario local ./bin/qmake
./configure -xplatform win32-g++ -device-option CROSS_COMPILE=$cross_prefix_here -nomake examples ...
luego ejecutas "make" normal y lo construye para mingw
make
make install
entonces
-
si
-
solo si necesita usar algo que no sea msvcrt.dll (el valor predeterminado). Aunque nunca he usado nada más, así que no lo sé con certeza.
-
https://stackoverflow.com/a/18792925/32453 enumera algunos parámetros de configuración.