Compiler wxWidgets

C'est un framework qui permet de développer des applications graphiques pour Windows, Linux et Macintosh en utilisant le même code source ! À titre d'exemple, quasiment tous les logiciels disponibles sur ce site sont conçus avec cette bibliothèque.

wxWidgets fait un lien à la compilation vers les API natives des systèmes d'exploitation cibles. C'est pour cette raison que vos applications se fondent dans le décor. Du coup, vous n'avez pas besoin d'être expert en API Windows ou en GTK. Ce choix implique que vous ne serez jamais confronté à la nécessité d'installer GTK sous Windows.

wxWidgets a plusieurs qualités : simple une fois installé, portabilité, beaucoup de fonctions, documentation détaillée en ligne et au format CHM portable...

Les grandes lignes de cet article sont valables pour les versions 2.8, 3.0 et la dernière 3.2.x de la librairie.

Configuration initiale

wxWidgets.org est le site où vous trouverez le code source à compiler vous-même. Cela permet d'avoir une compilation aux petits oignons et réduire la taille de l'exécutable final au maximum. Cela permet aussi de profiter des optimisations de votre compilateur favori.

La même source se compile pour Windows («wxMSW»), Linux («wxGTK») et MacOS («wxMac»).

Pour une première installation ou pour la version de développement, vous voudrez sûrement tout compiler par défaut. Mais pour construire un exécutable optimisé pour la version finale, il sera préférable de ne sélectionner que les composants nécessaires. Les versions compilées Release et Debug peuvent co-exister.

1) Dans le dossier wxWidgets\build\(msw|osx)\, modifiez le fichier config.* qui active les groupes de fichiers à compiler. Voici un exemple le plus réduit pour une application fenêtrée :

SHARED = 0
WXUNIV = 0
UNICODE = 1
BUILD = release
DEBUG_INFO = 0
DEBUG_FLAG = 0
MONOLITHIC = 0
USE_GUI = 1
USE_HTML = 0
USE_WEBVIEW = 0
USE_MEDIA = 0
USE_XML = 0
USE_XRC = 0
USE_AUI = 0
USE_RIBBON = 0
USE_PROPGRID = 0
USE_RICHTEXT = 0
USE_STC = 0
USE_OPENGL = 0
USE_QA = 0
USE_EXCEPTIONS = 0
USE_RTTI = 0
USE_CAIRO = 0

2) Dans le fichier include\wx\(msw|gtk|osx)\setup.h, désactivez les directives C++ qui activent les classes dont vous n'avez pas besoin. Cela nécessite évidemment de connaître ce que contient la librairie. Cette copie du fichier (v3.2.1) est la plus minimaliste que j'utilise.

3) Après compilation, des sous-dossiers apparaissent dans les répertoires build\(msw|gtk|osx)\ et lib\. En faisant une opération de type make clean, ils ne sont pas intégralement supprimés. Pour pouvoir relancer une compilation qui a échoué, c'est-à-dire pour considérer la dernière version du fichier setup.h modifiée entre temps, il faut supprimer ces sous-dossiers à la main.

Pour Windows

La compilation

On prendra Visual C++ téléchargeable ici.

Décompressez la version ZIP de wxWidgets dans un dossier sans accent et sans espace pour éviter tout problème.

Touche Windows+Pause, Avancé, Variables d'environnement (ou via le panneau d'administration disponible dans le menu Démarrer), ajoutez une variable utilisateur : WXWIN="c:\chemin-de-wxmsw"

Allez dans le dossier BUILD\MSW pour éditer "config.vc" avec un éditeur de texte. Changez a minima : BUILD=release, UNICODE=1, DEBUG_INFO=0 et DEBUG_FLAG=0. L'unicode est enfin généralisé dans la version 3 de wxWidgets. Si vous développez en ANSI, vous ne verrez pas les bugs de compilation liés à l'unicode. Alors que c'est possible dans l'autre sens.

Dans les anciennes versions de Visual C++, ouvrez une console via Démarrer, Exécuter, command. Sinon, avec une version récente de Visual C++, il faut ouvrir la console via les raccourcis créés par l'installation de Visual Studio du menu démarrer, par exemple «x86 Native Tools Command Prompt for VS 2019» pour que les variables d'environnement soient bien chargées. Le terme x86 dénotera une version 32 bits, et x64 une version 64 bits.

cd %WXWIN%\build\msw
nmake -f makefile.vc

Ouvrir le dossier LIB\VC_LIB. Il doit y avoir des fichiers .LIB partout. Le dossier BUILD\MSW\VC_MSW contient tous les OBJ.

Pour avoir des DLL, modifier le fichier config.vc dans SHARED et RUNTIME_LIBS, et recommencez (depuis une installation propre).

Pour nettoyer ce qui a été compilé :

cd %WXWIN%\build\msw
nmake clean -f makefile.vc

Si votre compilation est en échec ou si la configuration doit être corrigée, supprimez les reliquats de fichiers expliqués dans le chapitre sur la configuration.

Configurer Visual C++

Définir la variable d'environnement WXWIN ne suffit pas.

Lancez l'application, Tools, Options, onglet Directories. Ou alors menu Projet, Options de.

Dans "Include files", ajouter "c:\chemin-de-wx\include" et "c:\chemin-de-wx\include\msvc".

Dans "Library files", ajouter "c:\chemin-de-wx\lib\vc_lib".

Ajouter les chemins de wxWidgets à votre projet

Configurer un nouveau projet

File, New, Win32 Application, An empty project.

Project, Settings. Se placer en "All configurations".

Si nécessaire, onglet "Link", categorie "General", ajouter dans "Object/library modules" les librairies "comctl32.lib rpcrt4.lib winmm.lib advapi32.lib wsock32.lib". De façon générale, si vous utilisez des fonctions spéciales de Windows, le site MSDN vous dira quel est le bon fichier LIB à importer au cas où vous auriez des erreurs de lien. Par exemple, winmm sert aux fonctionnalités multimédia.

Fichiers LIB de Windows dans votre projet wxWidgets

Onglet C/C++, catégorie "Code generation", sélectionner "Multithreaded DLL" (/MD).

Onglet C/C++, catégorie "Preprocessor", ajouter dans les définitions "wxUSE_GUI=1,wxUSE_UNICODE=1,_UNICODE". Pour la version release, il est important d'ajouter aussi NDEBUG et surtout wxDEBUG_LEVEL=0 plus récemment (sinon vous aurez des erreurs avec wxTrap).

Préprocesseur dans votre projet wxWidgets

Onglet Linker, catégorie "System", indiquez le sous-système WINDOWS au lieu de CONSOLE, sinon un écran de console s'affichera à l'exécution de votre application.

Comme on a compilé wxWidgets en mode "release", vous devez mettre votre workspace en mode "release" dans Build, Set active configuration. Pour travailler en mode "debug", il faut recompiler wxWidgets comme spécifié dans le chapitre précédent.

Tout enregistrer. On peut compiler le projet avec "Rebuild all". Dans un sous-dossier Release ou Debug de votre projet, vous trouverez un exécutable EXE. Sa taille par défaut oscille autour de 1.5 Mo mais il doit être possible de faire moins encore.

Pour Linux

Prérequis

wxGTK utilise GTK. Il faut non seulement avoir GTK installé, mais aussi les fichiers de développement contenus dans le paquet libgtk+2.0_0-devel. Ainsi vous n'aurez plus le message :

"The development files for GTK+ were not found. For GTK+ 2, please ensure that pkg-config is in the path and that gtk+-2.0.pc is installed. For GTK+ 1.2 please check that gtk-config is in the path, and that the version is 1.2.3 or above. Also check that the libraries returned by 'pkg-config gtk+-2.0 --libs' or 'gtk-config --libs' are in the LD_LIBRARY_PATH or equivalent".

Installer une machine virtuelle

Si vous avez Windows, il est nécessaire d'installer un système Linux. Soit vous optez pour une solution de cohabitation (dual-boot), soit vous utilisez un émulateur VirtualBox qui partagera les ressources actuelles de votre ordinateur.

Dans la catégorie des Linux stables et minimalistes, le choix d'une Debian sera fait. L'image du CD d'installation est disponible en ligne.

Suivez les instructions graphiques et terminez sans rien installer en plus du système de base (décochez toutes les options). Une fois que tout est fini au bout d'une petite heure au maximum, connectez-vous avec l'utilisateur ROOT et lancez :

apt-get install vim lxde xinit xserver-xorg zip unzip bzip2 g++ clang make libgtk-3-dev build-essential --no-install-recommends

Déconnectez-vous du compte root :

logout

Une fois connecté sous votre compte utilisateur, vous lancez le bureau avec :

startx

Il est vrai que vous n'aurez pas grand chose sur votre Bureau, tout au plus un éditeur de texte, une calculatrice, un explorateur de fichier et une console. Mais cette installation minimaliste et performante est tout ce dont on a besoin. Elle tiendra dans environ 1,6 Go.

Debian LXDE

Compiler la librairie

Téléchargez la dernière version de wxGTK. Dans cet exemple, il s'agit de la version 3.0.2 mais vous pouvez aussi prendre la version 2.8.12 si vous le souhaitez :

wget https://github.com/wxWidgets/wxWidgets/releases/download/v3.0.2/wxWidgets-3.0.2.tar.bz2 --no-check-certificate

Décompressez l'archive dans un dossier de votre compte utilisateur. En utilisant XArchiver sur votre bureau, la décompression peut se faire visuellement.

Dans une console, commençons la compilation de wxWidgets :

cd /home/votre_login/dossier_wxgtk
mkdir buildgtk
cd buildgtk
../configure --with-gtk --enable-unicode --disable-debug --disable-debug_flag --disable-shared --enable-no_rtti

Pour compiler avec CLang qui produit des librairies et des exécutables de plus petite taille (parfait pour une petite machine virtuelle), vous devez modifier la dernière ligne de commande :

CC=clang CXX=clang++ ../configure [liste des paramètres ci-dessus] --disable-precomp-headers

Dans les paramètres de compilation, je précise l'utilisation de l'Unicode (pour gérer le chinois, taiwanais...) et la désactivation des librairies partagées. Cela veut dire que wxWidgets sera compilé et inclus dans l'application, et non pas lié comme une librairie externe. Le fichier sera plus lourd, mais vous n'aurez pas à déployer ces fichiers annexes. Dans la pratique, les librairies de wxWidgets n'existent pas toujours dans la bonne configuration voulue (OS Linux, encodage, version, debug...).

Configured wxWidgets 2.8.9 for `i686-pc-linux-gnu'

Which GUI toolkit should wxWidgets use? GTK+ 2
Should wxWidgets be compiled into single library? no
Should wxWidgets be compiled in debug mode? no
Should wxWidgets be linked as a shared library? no
Should wxWidgets be compiled in Unicode mode? yes
What level of wxWidgets compatibility should be enabled?
  wxWidgets 2.4 no
  wxWidgets 2.6 yes
Which libraries should wxWidgets use?
  jpeg sys
  png sys
  regex sys
  tiff builtin
  zlib sys
  odbc no
  expat builtin
  libmspack no
  sdl no

On enchaîne avec make pour compiler. Ca prend plusieurs minutes.

Pour annuler un make, il faut exécuter make distclean et recommencer au point de configuration.

Si vous compilez wxWidgets en tant que librairie externe (mode shared non utilisé ici), l'instruction suivante permet de rendre les fichiers disponibles à tous les utilisateurs :

su
make install
ldconfig
exit

Pour annuler cette opération, exécuter make uninstall en mode root.

Pour compiler

Si wxWidgets a été installé en mode "shared", la commande suivante permet de compiler votre fichier C++. En cas de problème, wx-config se situe dans le dossier buildgtk.

g++ *.cpp `wx-config --libs --cxxflags` -o mon_appli

Or nous compilons tout en un. Il faut donc spécifier manuellement nos bibliothèques :

wxpath="/home/.../buildgtk"
g++ *.cpp `$wxpath/wx-config --libs --cxxflags` -I "$wxpath/lib" -o mon_appli

Remarques :

  • Pour débugger une application, il faut avoir une version "debug" de wxWidgets et donc réaliser une nouvelle compilation avec l'option --enable-debug au lieu de --enable-release.
  • GCC ne compile pas comme le C++ de Microsoft. En testant plusieurs compilateurs, vous garantissez la qualité de votre code.
  • La cross-compilation est possible.

Programmer en wxWidgets

Une FAQ de bugs est disponible sur ce site. Vous pouvez laisser des questions, dans la limite des réponses que je pourrai apporter.

Hello World en wxWidgets

Pour compléter votre développement, téléchargez le fichier d'aide au format PDF, HTML ou CHM. Ce dernier est conseillé, car c'est un tout facilement transportable.

Avec wxWidgets, tout est fait pour que le développement soit indépendant de la plateforme. Certains aspects, comme par exemple la structuration du système de fichier, restent néanmoins utiles à considérer.

Si vous avez encore des soucis de compilation, la page suivante vous l'expliquera en anglais.

Avez-vous trouvé l'information que vous cherchiez ? Votre retour d'expérience sur le site nous intéresse.

Dernière modification le 4 décembre 2022 à 22:18