Meilleures pratiques pour le développement "multi-plateforme" avec Qt

Selon qt.nokia.com , Qt est un "framework d'application et D'interface utilisateur multiplateforme", vous permettant d ' "écrire du code une fois pour cibler plusieurs plates-formes". Le SDK Qt est un "environnement de développement complet" contenant "les outils dont vous avez besoin pour créer des applications multiplateformes avec Qt en une seule installation". Qt Creator est un "IDE multi-plateforme" qui " fonctionne sur les systèmes D'exploitation de bureau Windows, Linux/X11 et Mac OS X, et permet aux développeurs de créer des applications pour plusieurs ordinateurs de bureau et plates-formes d'appareils mobiles."

Les mots magiques "cross compilation" ne sont pas mentionnés explicitement ces textes de présentation du site web. Néanmoins, un lecteur naïf peut être pardonné de déduire que vous pouvez télécharger le SDK Qt (y compris Qt Creator) pour n'importe quel système hôte que vous utilisez pour le développement, créer un projet et écrire du code à partir duquel vous pouvez facilement générer des exécutables Pour Windows, Linux, Mac, etc. En "facilement", j'ai à l'esprit quelque chose comme cocher quelques cases dans un boîte de dialogue Paramètres de construction, et en appuyant sur le bouton" Construire".

Je cherche toujours ces cases à cocher! Pendant ce temps, j'ai trouvé divers articles, ici et ailleurs, sur l'installation d'un compilateur croisé, l'installation de binaires supplémentaires, la réécriture de votre fichier qmake, etc. Du marketing, je m'attendais en quelque sorte à ce que la compilation croisée soit déjà entièrement et directement supportée avec une installation "prête à l'emploi" des outils IDE et SDK. Ai-je raté quelque chose d'évident?

Sinon, j'ai machines de développement disponibles avec les trois systèmes d'exploitation. Devrais - je simplement installer Qt Creator sur les trois plates-formes? Si je fais cela, puis-je m'attendre à pouvoir prendre un projet Qt (ou peut-être juste le code source) que j'ai développé en utilisant Qt Creator pour, disons, Windows, le copier sur ma machine Mac ou Linux, et le construire en utilisant la version de Qt Creator pour cette plate-forme, sans rencontrer de problèmes majeurs? Cela pourrait-il même être la meilleure pratique pour utiliser Qt pour créer des exécutables pour plusieurs plates-formes, par rapport à l'installation d'outils de compilation croisée sur un seul hôte de développement?

31
demandé sur Jan Hettich 2011-01-29 23:51:38

6 réponses

Le slogan de Qt est:

Écrivez une fois, compilez partout.

Dans cet esprit, Qt n'offre officiellement aucune solution prête à l'emploi pour la compilation croisée des applications Qt d'une plate-forme spécifique vers d'autres plates-formes différentes. Bien que certainement do-able, si beaucoup de travail et de temps est investi, QT bonne pratique commune vous suggère de construire votre application Qt directement sur la plate-forme ciblée. Cela signifie, construisez votre cible Windows pour votre application un a Machine Windows, votre cible Mac sur une machine Mac et la cible Linux sur un, vous avez deviné à droite ( : -) ), une machine Linux.

C'est ainsi "écrire une fois, compiler partout", à mon avis est une combinaison de mots très bien choisie. Sinon, la ligne de balise aurait pu être, "écrire une fois, compiler pour tout".

Pour en revenir au problème d'origine, vous n'avez même pas besoin de machines physiques différentes pour chacune des plates-formes ciblées, car à l'ère des bonnes solutions de virtualisation vous pouvez facilement configurer quelques machines virtuelles et construire votre application sur différentes plates-formes à partir de la même machine physique.

Comme pour les autres questions qui n'ont pas directement répondu à votre question:

Devrais-je simplement installer Qt Creator sur tous les trois plates-formes? Si je fais ça, peut Je m'attends à pouvoir prendre un Qt projet (ou peut-être juste la source code) que j'ai développé en utilisant Qt Creator pour Windows, copier sur ma machine Mac ou Linux, et construire là en utilisant la version de Qt Le créateur de cette plate-forme, sans en cours d'exécution dans certains grands problèmes?

Oui. Les problèmes mineurs sont des choses comme obtenir vos applications exécutables/binaires icônes droit sur les trois principales plates-formes(Windows, Linux, Mac) ou Mac Dock intégration avancée ou des problèmes d'intégration de barre de plateau entre les deux. Ces problèmes peuvent être traités sans casser la caractéristique multi-plateforme de votre code, en encapsulant correctement votre code spécifique à la plate-forme dans les directives du compilateur comme #define pour par exemple. Je recommande également de le faire pour tous les autres codes spécifiques à la plate-forme dont votre application a besoin ou si vous utilisez largement le code spécifique à la plate-forme, en séparant des blocs entiers de code spécifique à la plate-forme en plusieurs bibliothèques chargées dynamiquement(ou bibliothèques partagées) spécifiques à chaque plate-forme, mais en exportant la même interface générique

Serait-ce même la meilleure pratique pour utilisation de Qt pour créer des exécutables pour mutiple plates-formes, vs. installation outils de compilation croisée sur un seul hôte de développement?

Vous devez utiliser le SDK Qt (Qt Creator ou les outils de ligne de commande) pour construire votre application dans la mesure du possible, car des outils comme qmake prendront la charge de la gestion .fichiers MOC manuellement dans vos Makefiles. Mais si cela devient impossible pour plusieurs raisons, par exemple. comme votre entreprise imposant le développement de Visual Studio (plate-forme croisée hein?), il existe de nombreux tutoriels sur la façon de gérer les builds basés sur Qt en utilisant des systèmes de construction comme MS Visual Studio, GNU autotools ou CMake. Bien que je recommande de coller avec qmake, qui est un bon générateur "make makefile" et facilement adaptable à tous les hacks spécifiques à la plate-forme dont vous pourriez avoir besoin pour que votre application construise correctement, plutôt que d'utiliser un système de construction plus confortable pour les hacks spécifiques à la plate-forme et ensuite essayer de répondre aux besoins Après tout, si vous développez votre application dans Qt pour des raisons multiplateformes, Qt devrait être le framework principal de votre application et non l'api/code spécifique à la plate-forme ou les bibliothèques tierces que vous pourriez utiliser.

J'espère avoir été assez clair et utile.

PS: je suis également la bienvenue aux suggestions ou corrections / ajouts concernant ce que j'ai écrit dans les commentaires.

21
répondu Shinnok 2011-01-31 11:50:30

Vous pouvez utiliser MinGW pour la compilation croisée sous Linux Pour Windows. La compilation croisée sur Mac n'est pas possible en raison de problèmes techniques. Il n'y a pas de moyen facile de le faire à partir de L'interface graphique, mais ici est un bon how - to sur la compilation croisée QtWebKit Pour Windows. Cela peut être appliqué à N'importe quel projet Qt.

6
répondu ismail 2011-01-29 21:11:38

Je ne pense pas qu'il y ait une configuration de compilation croisée.

A propos de la portabilité du projet complet, je dirais "presque" parce que j'ai trouvé quelques pépins ennuyeux. Néanmoins, votre code source sera 100% portable et recompiler sur une autre plate-forme nécessitera juste quelques astuces dans le. pro.

Ce que je fais est de travailler avec une seule plate-forme (Linux) et de temps en temps compiler en utilisant ma machine Windows et mon Mac Mini. Ce avec quoi je me bats normalement ne sont que quelques uns directives sur l'endroit où trouver des bibliothèques externes ou inclure des fichiers. Aussi, lorsque vous travaillez sur Mac, je dois copier des fichiers externes dans le paquet d'applications afin que le programme puisse les trouver.

3
répondu 6502 2011-01-29 21:10:33

La dernière fois que J'utilisais Qt, et c'était il y a des années, vous deviez compiler sur chaque plate-forme pour laquelle vous vouliez un binaire. Bien sûr, vous pourriez cross-compiler, mais je pense que ce serait à vous de mettre en place une telle chose.

Peut-être que quelqu'un d'autre fournira une meilleure question, mais je ne pense pas que vous manquez quoi que ce soit.

2
répondu pupeno 2011-01-29 21:01:57

Je ne connais pas les systèmes Linux. Mais pour développer une application Qt ciblant Mac OS X et Windows, vous avez besoin d'une machine de développement pour chacun d'eux. Il n'y a pas de compilation croisée pour les deux.

Qt est multi-plateforme dans le sens où les mêmes fichiers source peuvent créer une application pour différentes plates-formes. Avec toutes les machines virtuelles disponibles, une configuration de machine unique (physique) pour développer et construire plusieurs cibles ne devrait pas poser trop de problème. En fait, c'est exactement comme ça que je travaille sur mon projet actuel qui cible à la fois Mac et Windows.

2
répondu Stephen Chu 2011-01-29 21:05:25

La compilation croisée est généralement utilisée pour développer des logiciels sur un système Linux hôte et compiler pour un système Linux cible. Pendant des années, j'ai utilisé un système Linux fonctionnant sur un x86 avec X11 (KDE) pour compiler notre application Qt pour un système ARM embarqué exécutant Qt Embedded. Si vous faites des applications mobiles, vous êtes probablement cross-compilation. Vous pouvez cross compiler sur un système Windows, Bien sûr. Tout ce dont vous avez vraiment besoin est le compilateur croisé. Puisque gcc est disponible dans le code source, les compilateurs croisés gcc sont assez commun. Pour effectuer une compilation croisée avec Qt, vous avez besoin d'un mkspec pour qmake qui spécifie les compilateurs à utiliser.

Votre dernier paragraphe indique que vous ne serez probablement pas en mesure de faire ce genre de compilation croisée-vous pouvez le faire sur votre machine Windows Pour Linux ou probablement pour Mac, et vous pouvez probablement le faire sur Linux Pour Windows si vous utilisez la version mingw de Qt sur Windows, mais vous ne compilerez jamais une application basée sur Windows.

Bottom line -- faites ce que vous avez indiqué. Obtenez votre source sur chaque plate-forme cible et compilez-la là.

1
répondu Scott 2011-02-01 00:01:01