GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo configuro Qt para la compilación cruzada de Linux a destino de Windows?

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:

  1. Inicie el contenedor docker:
sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash
  1. 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

  1. si

  2. 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.

  3. https://stackoverflow.com/a/18792925/32453 enumera algunos parámetros de configuración.


Linux
  1. Cómo establecer una dirección IP estática y configurar la red en Linux

  2. Cómo usar un escritorio remoto desde Windows a un escritorio Linux usando XRDP

  3. ¿Cómo acceder a la carpeta compartida de Windows desde Linux?

  4. ¿Cómo hacer el paquete de prueba de Travis CI para Linux, OS X, Windows?

  5. ¿Cómo comparto internet con Windows desde mi caja Linux?

Cómo instalar el subsistema de Windows para Linux

Cómo configurar Linux como un enrutador estático

Cómo SSH en su servidor Linux desde Windows

Cómo SSH en una máquina con Windows 10 desde Linux O Windows O en cualquier lugar

Cómo instalar y configurar el subsistema de Windows para Linux

Cómo configurar la dirección IP estática en el sistema Linux