GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso configurare Qt per la compilazione incrociata da Linux a destinazione Windows?

Un altro modo per compilare in modo incrociato il software per Windows su Linux è la toolchain MinGW-w64 su Archlinux. È facile da usare e mantenere e fornisce versioni recenti del compilatore e molte librerie. Personalmente lo trovo più semplice di MXE e sembra adottare le versioni più recenti delle librerie più velocemente.

Innanzitutto, avrai bisogno di una macchina basata su arch (saranno sufficienti una macchina virtuale o un contenitore docker). Non deve essere Arch Linux, andranno bene anche i derivati. Ho usato Manjaro Linux. La maggior parte dei pacchetti MinGW-w64 non sono disponibili nei repository ufficiali di Arch, ma ce ne sono molti in AUR. Il gestore di pacchetti predefinito per Arch (Pacman) non supporta l'installazione direttamente da AUR, quindi dovrai installare e utilizzare un wrapper AUR come yay o yaourt. Quindi installare la versione MinGW-w64 delle librerie Qt5 e Boost è facile come:

yay -Sy mingw-w64-qt5-base mingw-w64-boost
#yaourt -Sy mingw-w64-qt5-base mingw-w64-qt5-boost #if you use yaourt

Questo installerà anche la toolchain MinGW-w64 (mingw-w64-gcc ) e altre dipendenze. La compilazione incrociata di un progetto Qt per Windows (x64) è quindi semplice come:

x86_64-w64-mingw32-qmake-qt5
make

Per distribuire il tuo programma dovrai copiare le DLL corrispondenti da /usr/x86_64-w64-mingw32/bin/ . Ad esempio, in genere dovrai copiare /usr/x86_64-w64-mingw32/lib/qt/plugins/platforms/qwindows.dll a program.exe_dir/platforms/qwindows.dll .

Per ottenere una versione a 32 bit devi semplicemente usare i686-w64-mingw32-qmake-qt5 invece. I progetti basati su Cmake funzionano altrettanto facilmente con x86_64-w64-mingw32-cmake .Questo approccio ha funzionato molto bene per me, è stato il più facile da impostare, mantenere ed estendere. Si adatta anche ai servizi di integrazione continua. Sono disponibili anche immagini docker.

Ad esempio, supponiamo di voler creare la GUI del downloader di sottotitoli QNapi. Potrei farlo in due passaggi:

  1. Avvia il contenitore docker:
sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash
  1. Clona e compila QNapi
git clone --recursive 'https://github.com/QNapi/qnapi.git' 
cd qnapi/ 
x86_64-w64-mingw32-qmake-qt5
make

Questo è tutto! In molti casi, sarà così facile. Anche l'aggiunta delle proprie librerie al repository di pacchetti (AUR) è semplice. Dovresti scrivere un file PKBUILD, che è il più intuitivo possibile, vedi mingw-w64-rapidjson, per esempio.


(Questo è un aggiornamento della risposta di @ Tshepang, poiché MXE si è evoluto dalla sua risposta)

Costruire Qt

Piuttosto che usare make qt per costruire Qt, puoi usare MXE_TARGETS per controllare la macchina e la toolchain di destinazione (32 o 64 bit). MXE ha iniziato a utilizzare .static e .shared come parte del nome di destinazione per mostrare quale tipo di libreria vuoi costruire.

# 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'

Nella risposta originale di @Tshepang, non ha specificato un MXE_TARGETS e viene utilizzato il valore predefinito. Al momento in cui ha scritto la sua risposta, il valore predefinito era i686-pc-mingw32 , ora è i686-w64-mingw32.static . Se imposti esplicitamente MXE_TARGETS a i686-w64-mingw32 , omettendo .static , viene stampato un avviso perché questa sintassi è ora deprecata. Se provi a impostare il target su i686-pc-mingw32 , mostrerà un errore poiché MXE ha rimosso il supporto per MinGW.org (ad esempio i686-pc-mingw32).

In esecuzione qmake

Come abbiamo cambiato il MXE_TARGETS , il <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake comando non funzionerà più. Ora, quello che devi fare è:

<mxe root>/usr/<TARGET>/qt/bin/qmake

Se non hai specificato MXE_TARGETS , fai questo:

<mxe root>/usr/i686-w64-mingw32.static/qt/bin/qmake

Aggiornamento: Il nuovo valore predefinito ora è i686-w64-mingw32.static


Basta usare M cross environment (MXE). Elimina il dolore dall'intero processo:

  • Scaricalo:

    $ git clone https://github.com/mxe/mxe.git
    
  • Installa le dipendenze di compilazione

  • Costruisci Qt per Windows, le sue dipendenze e gli strumenti di cross-build; questo richiederà circa un'ora su una macchina veloce con un accesso a Internet decente; il download è di circa 500 MB:

    $ cd mxe && make qt
    
  • Vai alla directory della tua app e aggiungi gli strumenti di cross-build al PERCORSO variabile d'ambiente:

    $ export PATH=<mxe root>/usr/bin:$PATH
    
  • Esegui lo strumento generatore di Qt Makefile, quindi crea:

    $ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
    
  • Dovresti trovare il file binario nella directory ./release:

    $ wine release/foo.exe
    

Alcune note :

  • Utilizzare il ramo principale del repository MXE; sembra ricevere molto più amore dal team di sviluppo.

  • L'output è un binario statico a 32 bit, che funzionerà bene su Windows a 64 bit.


Ok, penso di aver capito.

Basato in parte su https://github.com/mxe/mxe/blob/master/src/qt.mk e https://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak

Sembra che "inizialmente" quando esegui configure (con -xtarget, ecc.), configure quindi esegue il tuo "host" gcc per creare il file binario locale ./bin/qmake

 ./configure -xplatform win32-g++ -device-option CROSS_COMPILE=$cross_prefix_here -nomake examples ...

quindi esegui il normale "make" e lo compila per mingw

  make
  make install

quindi

  1. solo se è necessario utilizzare qualcosa di diverso da msvcrt.dll (impostazione predefinita). Anche se non ho mai usato nient'altro, quindi non lo so per certo.

  2. https://stackoverflow.com/a/18792925/32453 elenca alcuni parametri di configurazione.


Linux
  1. Come impostare l'indirizzo IP statico e configurare la rete in Linux

  2. Come eseguire il desktop remoto da Windows a desktop Linux utilizzando XRDP

  3. Come accedere alla cartella condivisa di Windows da Linux?

  4. Come creare un pacchetto di test Travis CI per Linux, OS X, Windows?

  5. Come eseguire SCP dal server Linux al client Windows

Come installare il sottosistema Windows per Linux

Come configurare Linux come router statico

Come SSH nel tuo server Linux da Windows

Come eseguire SSH in una macchina Windows 10 da Linux O Windows O ovunque

Come installare e configurare il sottosistema Windows per Linux

Come configurare l'indirizzo IP statico su un sistema Linux