Comment puis-je configurer Qt pour la cross-compilation de Linux à Windows cible?
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 en modifiant les 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 que -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 j'omets le -xplatform
option et définissez -platform
à ma cible spec (linux-win32-g++), il appelle le cross compilateur, mais ensuite les erreurs quand il trouve des Unix n'est pas défini.
Ici est une partie de la sortie de ma dernière tentative: http://pastebin.com/QCpKSNev.
Questions:
-
Lors de la compilation croisée quelque chose comme Qt pour Windows à partir d'un hôte Linux, si le compilateur natif de jamais - elle être invoquée? C'est, au cours d'une croix processus de compilation, ne devrions-nous pas utiliser seulement la croix compilateur? Je ne vois pas pourquoi Qt script configure essaie d'appeler mon système du compilateur natif alors que j'ai spécifié le
-xplatform
option. -
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.
-
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?
- Je crois qu'il a besoin d'une construction locale de qmake pour amorcer le reste de la construction. voir aussi les liens dans les stackoverflow.com/questions/1025687/...
- Ok, ça a du sens. Je vient de trouvé un autre problème, j'ai l'impression de mixage native et de la croix toolchains. L'erreur dans mon pastebin de sortie semble être due à l'appel de
x86_64-w64-mingw32-as
à la place de la langue maternelle. - J'ai rarement une marque DONC, la question en tant que favori, mais ce fut un unique et intéressante question avec un cool réponse.
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser M croix de l'environnement (MXE). Il prend la douleur hors de l'ensemble du processus:
Obtenir:
Installer les dépendances de construction
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:
Allez dans le répertoire de votre application et ajouter de la croix-créer des outils pour le CHEMIN variable d'environnement:
Exécuter l'intervalle Qt Makefile outil de générateur, puis construire:
Vous devriez trouver le binaire dans le ./répertoire de sortie:
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.
$ cd mxe && make qt
vous devez installer les exigences. Pour les systèmes Debian, cela signifiesudo apt-get install autoconf automake autopoint bash bison bzip2 cmake flex gettext git g++ gperf intltool libffi-dev libtool libltdl-dev libssl-dev libxml-parser-perl make openssl patch perl pkg-config python ruby scons sed unzip wget xz-utils
. Pour les autres systèmes, voir mxe.cc/#requirements(C'est une mise à jour de @Tshepang réponse, comme MXE a évolué depuis sa réponse)
Bâtiment Qt
Plutôt que d'utiliser
make qt
de construire Qt, vous pouvez utiliserMXE_TARGETS
pour contrôler votre machine cible et de la chaîne (32 - ou 64-bit). MXE commencé à utiliser.static
et.shared
comme une partie du nom de la cible pour montrer le type de lib que vous voulez construire.Dans @Tshepang d'origine de réponse, il n'a pas précisé un
MXE_TARGETS
, et la valeur par défaut est utilisé. Au moment où il écrit sa réponse, le défaut étaiti686-pc-mingw32
, maintenant, c'esti686-w64-mingw32.static
. Si vous définissez explicitementMXE_TARGETS
ài686-w64-mingw32
, en omettant.static
, un message d'avertissement est affiché parce que cette syntaxe est maintenant obsolète. Si vous essayez de définir la cible ài686-pc-mingw32
, il affiche une erreur comme MXE a supprimé le support MinGW.org (c'est à dire i686-pc-mingw32).De course
qmake
Que nous avons changé la
MXE_TARGETS
, le<mxe root>/usr/i686-pc-mingw32/qt/bin/qmake
de commande ne fonctionne plus. Maintenant, ce que vous devez faire est de:Si vous ne spécifiez pas de
MXE_TARGETS
, faites ceci:Mise à jour: La nouvelle valeur par défaut est maintenant
i686-w64-mingw32.static
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
ensuite, vous exécutez normal "faire", et il s'appuie pour mingw
donc
oui
seulement 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.
https://stackoverflow.com/a/18792925/32453 listes de configurer certains paramètres.
Afin de compiler Qt, il faut exécuter la
configure
script, la spécification de la plate-forme hôte avec-platform
(par exemple-platform linux-g++-64
si vous êtes en train de construire sur un linux 64 bits avec le compilateur g++) et la plate-forme cible avec-xplatform
(par exemple-xplatform win32-g++
si vous êtes à la croix de compiler pour windows).J'ai aussi ajouté ce drapeau:
-device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32-
ce qui spécifie le préfixe de la chaîne d'outils que j'utilise, qui sera ajouté à 'gcc' ou 'g++' dans tous les makefiles qui construisent des binaires pour windows.
Enfin, vous risquez d'avoir des problèmes lors de la construction de cim, qui, apparemment, est quelque chose qui est utilisé pour ajouter la prise en charge ActiveX Qt. Vous pouvez éviter cela en passant le drapeau
-skip qtactiveqt
au script configure. J'ai eu celui-là de sortir de ce rapport de bug: https://bugreports.qt.io/browse/QTBUG-38223Voici l'ensemble de configurer la commande que j'ai utilisé:
Que pour vos questions:
1 - Oui. Le compilateur natif sera appelé dans le but de construire des outils qui sont nécessaires dans le processus de construction. Peut-être des choses comme qconfig ou qmake, mais je ne suis pas entièrement sûr des outils qui, exactement.
2 - Désolé. Je n'ai aucune idée de quel type de fichiers sont dans le contexte de compilateurs =/. Mais autant que je sache, tu n'aurais pas à le gérer.
3 - Vous pouvez spécifier le compilateur croisé de préfixe dans la configuration de la ligne de commande au lieu de le faire dans le qmake.fichier conf, comme mentionné ci-dessus. Et il y a aussi ce problème avec idc, dont la solution de contournement que j'ai mentionnés.
Une autre façon de cross-compiler des logiciels pour Windows sur Linux est le mingw-w64 de la chaîne sur Archlinux. Il est facile à utiliser et à entretenir, et il fournit les dernières versions du compilateur et de nombreuses bibliothèques. Personnellement, je trouve ça plus facile que de MXE et il semble adopter de nouvelles versions de bibliothèques plus rapide.
D'abord, vous aurez besoin d'un arc-en fonction de la machine (machine virtuelle ou conteneur docker suffit). Il n'a pas à être Arch Linux, dérivés feront ainsi. J'ai utilisé de la Manjaro Linux.
La plupart des mingw-w64 les paquets ne sont pas disponibles à l'Arc de référentiels, mais il est beaucoup dans AUR. Par défaut le gestionnaire de package pour Arch (pacman) ne prend pas en charge l'installation directement à partir de AUR, de sorte que vous aurez besoin pour installer et utiliser un AUR wrapper comme pacaur ou yaourt. Ensuite, l'installation de mingw-w64 version de Qt5 et bibliothèques Boost est aussi simple que:
Ce sera également l'installer mingw-w64 de la chaîne d' (
mingw-w64-gcc
) et d'autres dépendances.Cross-compilation d'un projet Qt pour windows (x64) est alors aussi simple que:
À déployer des vous programme, vous devez copier les dlls correspondantes de
/usr/x86_64-w64-mingw32/bin/
.Pour obtenir une version 32 bits, il vous suffit d'utiliser
i686-w64-mingw32-qmake-qt5
à la place. Cmake-fondé des projets de travaux tout aussi facile avecx86_64-w64-mingw32-cmake
.Cette approche a très bien fonctionné pour moi, était le plus facile d'établir, de maintenir et d'étendre.
Il va aussi bien avec l'intégration continue des services. Il y a docker images aussi disponibles.
Par exemple, disons que je veux construire QNapi sous-titres downloader GUI. Je pourrais le faire en deux étapes:
1) Démarrer le conteneur docker:
2) les clones et compiler QNapi
Que c'est! Dans de nombreux cas, il sera facile. L'ajout de vos propres bibliothèques de dépôt de paquets (AUR) est également simple. Vous devez écrire un fichier PKBUILD, qui est aussi intuitif qu'il peut obtenir, voir mingw-w64-rapidjson, par exemple.