Le royaume de Eric Buist >> Informatique >> Quelques-unes de mes recherches personnelles >> Trucs et astuces
Me contacter Plan du site
<< Configurer XScreenSaver pour KDE Qt sous Windows Configuration d'une carte graphique ATI sous Linux >>

Qt sous Windows

Qt consiste en une librairie de classes C++ permettant la création d'interfaces graphiques. Il offre la possibilité d'écrire du code compatible source entre Linux, Windows et Macintosh tout en profitant d'une interface similaire pour les trois plate-formes. Cette page ne constituant pas un tutoriel sur Qt, l'utilisateur désireux d'en savoir plus peut se rendre sur www.trolltech.com.

Comme on peut le voir d'après le site, Qt est produit par la compagnie TrollTech qui ne souhaite malheureusement pas le donner! Sous Linux, il est complètement gratuit pour usage non commercial, ce qui est très bien, car il constitue la base de KDE, un excellent gestionnaire de fenêtres pour X Window System. Malheureusement, sous Windows, cela cause problème. Jusqu'à la version 2.3, seule la version professionnelle était disponible pour Linux et Windows. Ainsi, un étudiant d'université qui fait un devoir à l'aide de Qt ne peut compiler le résultat de son travail sous Windows.

Avec la version 2.3, une édition non-commerciale pour Windows est disponible. Malheureusement, on y trouve des contraintes d'utilisation qui en limitent l'usage à la compilation des programmes donnés en exemple, pas plus que ça! Bien que la meilleure solution soit d'installer Linux et de travailler sous ce système d'exploitation lors de travaux en C++/Qt, à moins d'exigences contraires, il existe quelques astuces pour permettre à une application Qt de se compiler sous Windows.

Préparatifs

Pour réaliser la compilation, le logiciel Microsoft Visual C++ 6 est nécessaire. Bien que d'autres compilateurs soient disponibles sous Windows, c'est le seul qui est supporté par Qt/Windows. Malheureusement, comme tout bon produit Windows, il n'est pas gratuit. Lorsque le logiciel est installé et semble daigner fonctionner, on peut passer à l'étape suivante, soit de télécharger Qt sur le site de TrollTech. Il faudra la version non-commerciale pour Windows. L'installation consiste à exécuter le programme d'installation, ce qui préparera l'environnement.

Puisqu'on cherche généralement à faire migrer un projet Linux vers Windows pour l'y compiler, le travail partira d'un fichier à extension .pro. Il est aussi possible de créer un projet Qt depuis l'environnement intégré de Visual C++ grâce aux outils ajoutés par l'installation de Qt. Le fichier projet .pro permet, à l'aide de l'utilitaire tmake, de construire un makefile, un fichier qui indique quoi compiler et comment. Ce makefile est spécifique à la plate-forme utilisée, pas le fichier projet.

La compilation d'un programme Qt se fera sans problèmes, mais l'édition de liens causera des difficultés majeures. On se rendra vite compte qu'aucun symbole spécifique à Qt n'est détecté et l'édition de liens retournera toujours des erreurs. Par comparaison avec les makefiles des exemples, j'ai découvert le bobo. La librairie Qt est compilée en mode multi-threading et il faut, pour s'y lier, compiler en mode multi-threading. Toutefois, le makefile produit par tmake ne permet pas cette compilation. Il faut donc modifier tmake!

Heureusement, le patch consiste à modifier un fichier de configuration. Supposons que Qt est installé dans c:\qt. Il faut alors modifier le fichier c:\qt\tmake\lib\win32-msvc\tmake.conf. C'est un fichier texte qui ne causera aucun problème pour GNU Emacs ou XEmacs. Il est formé d'affectations de valeurs à des variables. Certaines lignes doivent être remplacées pour corriger le bogue. Par exemple, pour corriger la ligne TMAKE_LIBS_QT, il faut retirer la ligne actuelle du fichier et ajouter la nouvelle. Voici les lignes à traiter de cette façon.

TMAKE_LIBS_QT = $(QTDIR)\lib\qt-mt230nc.lib $(QTDIR)\lib\qtmain.lib
TMAKE_CFLAGS            = -nologo -MD -DQT_DLL -DTHREAD_SUPPORT

Après la correction, tmake générera des makefiles compilables. Il faudra utiliser le target clean en cas de tentative de compilation sans cette correction.

Contraintes au niveau du code source

Visual C++ cause problème lors de la compilation de certains fichiers C++ développés sous Linux. Un programme compilant sous Linux sans erreurs compilera peut-être avec erreurs sous Windows. Ce phénomène se produit notamment lors de l'utilisation des classes de iostream. Afin d'éviter les messages d'erreur inexplicables, certaines règles de base peuvent être suivies.

#include

Visual C++ 6 adhère au standard C++ et ce standard stipule l'usage d'include sans .h pour les en-têtes standard. Par exemple, au lieu d'écrire #include <iostream.h>, on utilisera plutôt #include <iostream>. Cette convention s'applique uniquement aux en-têtes C++, comme iostream, fstream ainsi que les en-têtes de la STL.

Pour les en-têtes C, on ajoute un c avant le nom. Par exemple, au lieu d'inscrire #include <math.h>, on utilisera #include <cmath>. Ce qui s'applique pour cmath, cstdio, cstdlib, cstring, ... L'usage de cette convention fera disparaître un grand nombre d'erreurs inexplicables.

En cas d'usage de la STL, il faut impérativement ajouter l'instruction using namespace std; immédiatement après les inclusions avec #include. Autre spécificité importante: pour utiliser OpenGL, avant d'inclure gl/gl.h, l'en-tête windows.h doit être incluse. Il faudra utiliser une directive de compilation conditionnelle pour préserver la portabilité du code. Par exemple,

#ifdef _WIN32
#include <windows.h>
#endif
#include <gl/gl.h>

Opérateurs

Il existe d'autres subtilités à considérer et d'autres messages d'erreur sont donc envisageables. En cas de surdéfinition d'opérateurs binaires, les opérandes doivent être des références constantes. Par exemple, si on a une classe Vecteur avec un opérateur d'addition sur un autre vecteur, on aura la définition Vecteur operator+(const Vecteur& v).

Compilation

La compilation peut se faire sous Visual C++ ou sous DOS. Sous Visual C++, cela demeure relativement intuitif, mais ça devient intéressant de tenter l'expérience sous DOS. Il est notamment possible d'éditer ses sources sous Emacs et compiler depuis une fenêtre shell. Avant la compilation, il faut exécuter le script vcvars32 du répertoire VC98\bin de Visual Studio. Ce fichier configure des variables d'environnement qui rendent disponible la commande nmake qui permet de compiler un projet à partir d'un makefile. Ainsi, les commandes suivantes déclencheront la compilation.

tmake -o Makefile test.pro
nmake

Si on tape nmake clean au lieu de nmake seulement, les fichiers objets seront supprimés, ce qui recompilera le programme en entier. Il existe certes une foule d'autres options disponibles.