GNU/Linux >> Tutoriels Linux >  >> Linux

Comment configurer Qt pour la compilation croisée de Linux vers la cible Windows ?

Une autre façon de compiler des logiciels pour Windows sur Linux est la chaîne d'outils MinGW-w64 sur Archlinux. Il est facile à utiliser et à entretenir, et il fournit des versions récentes du compilateur et de nombreuses bibliothèques. Personnellement, je le trouve plus facile que MXE et il semble adopter plus rapidement les nouvelles versions des bibliothèques.

Tout d'abord, vous aurez besoin d'une machine basée sur une architecture (une machine virtuelle ou un conteneur Docker suffira). Il n'est pas nécessaire que ce soit Arch Linux, les dérivés feront également l'affaire. J'ai utilisé Manjaro Linux. La plupart des packages MinGW-w64 ne sont pas disponibles dans les dépôts Arch officiels, mais il y en a beaucoup dans AUR. Le gestionnaire de paquets par défaut pour Arch (Pacman) ne prend pas en charge l'installation directement depuis AUR, vous devrez donc installer et utiliser un wrapper AUR comme yay ou yaourt. Ensuite, l'installation de la version MinGW-w64 des bibliothèques Qt5 et Boost est aussi simple que :

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

Cela installera également la chaîne d'outils MinGW-w64 (mingw-w64-gcc ) et d'autres dépendances. La compilation croisée d'un projet Qt pour Windows (x64) est alors aussi simple que :

x86_64-w64-mingw32-qmake-qt5
make

Pour déployer votre programme, vous devrez copier les DLL correspondantes de /usr/x86_64-w64-mingw32/bin/ . Par exemple, vous devrez généralement copier /usr/x86_64-w64-mingw32/lib/qt/plugins/platforms/qwindows.dll à program.exe_dir/platforms/qwindows.dll .

Pour obtenir une version 32 bits, il vous suffit d'utiliser i686-w64-mingw32-qmake-qt5 Au lieu. Les projets basés sur Cmake fonctionnent tout aussi facilement avec x86_64-w64-mingw32-cmake .Cette approche a très bien fonctionné pour moi, était la plus facile à mettre en place, à maintenir et à étendre. Elle se marie également bien avec les services d'intégration continue. Des images Docker sont également disponibles.

Par exemple, disons que je veux créer une interface graphique de téléchargement de sous-titres QNapi. Je pourrais le faire en deux étapes :

  1. Démarrez le conteneur Docker :
sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash
  1. Cloner et compiler QNapi
git clone --recursive 'https://github.com/QNapi/qnapi.git' 
cd qnapi/ 
x86_64-w64-mingw32-qmake-qt5
make

C'est ça! Dans de nombreux cas, ce sera aussi simple que cela. L'ajout de vos propres bibliothèques au référentiel de packages (AUR) est également simple. Vous auriez besoin d'écrire un fichier PKBUILD, qui est aussi intuitif que possible, voir mingw-w64-rapidjson, par exemple.


(Ceci est une mise à jour de la réponse de @Tshepang, car MXE a évolué depuis sa réponse)

Construire Qt

Plutôt que d'utiliser make qt pour compiler Qt, vous pouvez utiliser MXE_TARGETS pour contrôler votre machine cible et votre chaîne d'outils (32 ou 64 bits). MXE a commencé à utiliser .static et .shared dans le cadre du nom de la cible pour indiquer le type de bibliothèque que vous souhaitez créer.

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

Dans la réponse originale de @Tshepang, il n'a pas spécifié de MXE_TARGETS , et la valeur par défaut est utilisée. Au moment où il a écrit sa réponse, la valeur par défaut était i686-pc-mingw32 , maintenant c'est i686-w64-mingw32.static . Si vous définissez explicitement MXE_TARGETS à i686-w64-mingw32 , en omettant .static , un avertissement s'affiche car cette syntaxe est désormais obsolète. Si vous essayez de définir la cible sur i686-pc-mingw32 , il affichera une erreur car MXE a supprimé la prise en charge de MinGW.org (c'est-à-dire i686-pc-mingw32).

En cours d'exécution qmake

Comme nous avons changé le MXE_TARGETS , le <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake commande ne fonctionnera plus. Maintenant, ce que vous devez faire est :

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

Si vous n'avez pas spécifié MXE_TARGETS , faites ceci :

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

Mise à jour : La nouvelle valeur par défaut est maintenant i686-w64-mingw32.static


Utilisez simplement l'environnement croisé M (MXE). Cela simplifie l'ensemble du processus :

  • Obtenez-le :

    $ git clone https://github.com/mxe/mxe.git
    
  • Installer les dépendances de compilation

  • Construisez Qt pour Windows, ses dépendances et les outils de construction croisée ; cela prendra environ une heure sur une machine rapide avec un accès Internet décent ; le téléchargement est d'environ 500 Mo :

    $ cd mxe && make qt
    
  • Accédez au répertoire de votre application et ajoutez les outils de construction croisée au PATH variable d'environnement :

    $ export PATH=<mxe root>/usr/bin:$PATH
    
  • Exécutez l'outil générateur Qt Makefile puis compilez :

    $ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
    
  • Vous devriez trouver le binaire dans le répertoire ./release :

    $ wine release/foo.exe
    

Quelques remarques :

  • Utilisez la branche master du référentiel MXE ; il semble obtenir beaucoup plus d'amour de la part de l'équipe de développement.

  • La sortie est un binaire statique 32 bits, qui fonctionnera bien sur Windows 64 bits.


Ok, je pense que j'ai compris.

Basé en partie sur https://github.com/mxe/mxe/blob/master/src/qt.mk et https://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak

Il semble que "initialement" lorsque vous exécutez configure (avec -xtarget, etc.), il configure puis exécute votre gcc "hosts" pour construire le fichier binaire local ./bin/qmake

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

puis vous lancez "make" normal et il le construit pour mingw

  make
  make install

donc

  1. oui

  2. uniquement si vous devez utiliser autre chose que msvcrt.dll (par défaut). Bien que je n'ai jamais utilisé autre chose, je ne sais pas avec certitude.

  3. https://stackoverflow.com/a/18792925/32453 répertorie certains paramètres de configuration.


Linux
  1. Comment effectuer un bureau à distance de Windows vers un bureau Linux à l'aide de XRDP

  2. Comment accéder au dossier partagé Windows à partir de Linux ?

  3. Comment créer un package de test Travis CI pour Linux, OS X, Windows ?

  4. Comment SCP du serveur Linux au client Windows

  5. Comment partager Internet avec Windows depuis ma machine Linux ?

Comment installer le sous-système Windows pour Linux

Comment configurer Linux en tant que routeur statique

Comment se connecter en SSH à votre serveur Linux à partir de Windows

Comment se connecter en SSH à une machine Windows 10 depuis Linux OU Windows OU n'importe où

Comment installer et configurer le sous-système Windows pour Linux

Comment configurer une adresse IP statique sur le système Linux