90 votes

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

Je veux cross compiler les bibliothèques Qt (et par la suite ma demande) pour un Windows x86_64 cible à l'aide d'un Linux x86_64 machine hôte. Je sens que je suis proche, mais j'ai peut-être une incompréhension fondamentale de certaines parties de ce processus.

J'ai commencé par l'installation de tous les mingw paquets sur ma Fedora machine, puis modification de l' win32-g++ qmake.fichier conf pour s'adapter à mon environnement. Cependant, j'ai l'impression d'être coincé avec certains apparemment évidente configurer les options de Qt: -platform et -xplatform. Documentation de Qt dit qu' -platform devrait être l'hôte de l'architecture de la machine (où vous êtes à la compilation) et -xplatform devrait être la plate-forme cible pour lequel vous souhaitez déployer. Dans mon cas, j'ai mis -platform linux-g++-64 et -xplatform linux-win32-g++ où linux-win32-g++ est mon modifiée win32-g++ configuration.

Mon problème est que, après l'exécution de configurer ces options, je vois qu'il invoque mon système du compilateur à la place de la croix compilateur (x86_64-w64-mingw32-gcc). Si je omettre l' -xplatform option et définissez -platform de mon objectif spec (linux-win32-g++), il appelle le cross compilateur, mais ensuite les erreurs quand il trouve des Unix n'est pas défini.

Voici quelques résultats de ma dernière tentative: http://pastebin.com/QCpKSNev.

Questions:

  1. Lors de la compilation croisée quelque chose comme Qt pour Windows à partir d'un hôte Linux, si le compilateur natif jamais être invoquée? C'est, au cours d'une croix processus de compilation, ne devrions-nous pas utiliser uniquement le cross compilateur? Je ne vois pas pourquoi Qt script configure essaie d'appeler mon système du compilateur natif alors que j'ai spécifié l' -xplatform option.

  2. Si je suis en utilisant un mingw cross-compilateur, quand vais-je avoir à traiter avec un fichier specs? Des fichiers de Spec pour GCC sont toujours une sorte de mystère pour moi, donc je me demandais si certains d'arrière-plan, ici, va m'aider.

  3. En général, au-delà de la spécification d'un compilateur croisé dans ma qmake.conf, quoi d'autre pourrait-je prendre en considération?

79voto

Tshepang Points 2693

Utilisez simplement M croix de l'environnement (MXE). Il prend la douleur hors de l'ensemble du processus:

  • Obtenir:

    $ git clone https://github.com/mxe/mxe.git
    
  • Construire Qt pour Windows, ses dépendances, et la croix-outils de construction; cela prendra environ une heure sur une machine rapide décent avec accès à l'internet; le téléchargement est d'environ 500 MO:

    $ cd mxe && make qt
    
  • Obtenir le répertoire de votre application et ajouter de la croix-créer des outils pour le CHEMIN d'accès:

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

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

    $ wine release/foo.exe
    

Quelques notes:

  • Utiliser la branche principale de la MXE référentiel; il semble avoir beaucoup plus d'amour de l'équipe de développement.

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

18voto

Timothy_G Points 223

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

La Construction De Qt

Plutôt que d'utiliser make qt de construire Qt, vous pouvez utiliser MXE_TARGETS pour contrôler votre machine cible et de la chaîne (MinGW 32 ou MinGW-w64, 32 ou 64 bits). MXE commencé à l'aide d' .static et .shared pour afficher les lib que vous voulez construire.

# The following is the same as `make qt`, see explanation after the code block.
make qt MXE_TARGETS=i686-pc-mingw32.static    # MinGW 32,  32-bit, static libs
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 @Tshepang d'origine de réponse, il n'a pas précisé l' MXE_TARGETS, et la valeur par défaut est utilisé. Au moment où il écrit sa réponse, la valeur par défaut est i686-pc-mingw32, il est maintenant i686-pc-mingw32.static. Si vous définissez explicitement MXE_TARGETS de i686-pc-mingw32, en omettant .static, un message d'avertissement est affiché parce que cette syntaxe est maintenant obsolète.

L'exécution qmake

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

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

Si vous n'avez pas à spécifier MXE_TARGETS, ce faire:

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

4voto

rogerdpack Points 12806

Ok je pense que je l'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 le "d'abord" lorsque vous exécutez le configurer (avec xtarget, etc.), il configure puis exécute votre "hôte" de gcc pour construire le local de fichier binaire ./bin/qmake

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

ensuite, vous exécutez normal "faire", et il s'appuie pour mingw

  make
  make install

donc

  1. oui

  2. si vous avez besoin d'utiliser autre chose que msvcrt.dll (par défaut). Bien que je n'ai jamais utilisé autre chose donc je ne sais pas pour certains.

  3. http://stackoverflow.com/a/18792925/32453 les listes de configurer certains paramètres.

0voto

migas Points 126

Je sais que je suis un peu en retard pour la fête, mais j'avais exactement le même problème. J'ai donc créé un fichier make contenant quelques scripts pour compiler Qt et OpenCV de manière statique sous Linux et lier le projet Qt pour Windows.

Vous pouvez l'utiliser tant que vous supprimez tout ce qui est lié à opencv :)

Trouvez le ici .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X