Complier Qt en Static sous Windows

Lorsque l'on crée une application pour Linux avec Qt on peut être intéressé par la rendre multiplateforme. Sous Linux, Qt est généralement installé par défaut, ou dans le cas contraire facilement installable avec le gestionnaire de paquets systèmes. Mais sous windows, installer Qt est plus compliqué et plus lourd. Ce n'est pas une habitude sous windows de demander d'installer des dépendances. C'est pourquoi il peut être intéressant de compiler Qt en static. Ainsi, lors de la création de l'exécutable avec la version Static, le programme embarquera Qt et vos utilisateurs n'auront absolument pas besoin de l'installer. Voici la démarche.

Mise en oeuvre

Notez que toutes ces opérations se font bien sûr sous Windows.

1. Installation de Qt Dynamique + sources

Installez Qt 5.5 (ou une autre version 5.x selon votre choix et ce qui est disponible) grâce à l'installateur fournit par Qt ici. Il est primordial de sélectionner pour cette version, mingw32 ainsi que les sources, qui seront nécessaires pour la compilation de la version static ensuite. Notez que QtCreator sera installé avec le reste, nul besoin de l'installer à part.

2. Installation des dépendances nécessaires à la compilation

Pour chaque programme, choisissez d'ajouter le programme dans le PATH lorsque cela vous est proposé (cocher la case dans l'installateur). Commencez par installer python en téléchargeant la dernière version 3.x sur leur site. Installez ensuite perl (sous windows ce sera Strawberry-perl). Enfin, installez ruby, en téléchargeant la dernière version de Rubyinstaller depuis leur site. Notez que si vous avez un Windows 64 bits, vous pouvez prendre la version 64 bits de ces programmes (bien que Qt sous windows soit en 32bits avec mingw32).

3. Modifier les mkspecs de Qt pour rendre la compilation static

Ouvrez le fichier C:Qt5.5Srcqtbasemkspecswin32-g++qmake.conf (à adapter selon votre version de Qt), recherchez dans ce fichier la ligne suivante :

QMAKE_LFLAGS            =

et la remplacer apr :

QMAKE_LFLAGS            = -static -static-libgcc
4. Préparation de la compilation :

Ouvrez la console Qt (Menu démarrer --> Tous les programmes --> Qt --> 5.5 --> Qt 5.5 for Desktop (MinGW 4.9.2 32 bit)       [Ceci peut légèrement différer en fonction de votre version de Qt et de MinGW]. Vérifiez que les différentes dépendances sont bien dans le path : Exécuter les commandes suivantes :

python ––version ruby ––version perl ––version

Chaque commande doit vous donner la version et vous ne devez en aucun cas avoir pour réponse que la commande est inconnue : checkDeps Si une commande n'est pas le path, contactez-moi par commentaire pour avoir de l'aide (mais si vous avez bien suivi ce tuto tout devrait aller !).

5. Lancement de la compilation :

Dans la console allez dans le dossier qtbase des sources :

cd C:\Qt5.5\Src\qtbase

Lancez la configuration de la compilation :

configure -static -release -opengl desktop -opensource -platform win32-g++

Répondre y pour accepter la licence. Puis attendre quelques minutes que l'exécution se termine. Quand c'est terminé, lancez la compilation :

mingw32-make sub-src

Attendre que la compilation se termine. Ceci peut prendre plusieurs heures.

6. Configurer Qt Creator pour qu'il utilise la version Qt STATIC

Ouvrez Qt creator. Allez dans les options (Outils --> Options...), dans l'onglet Compiler & Exécuter. Dans l'onglet Versions de Qt, sélectionnez Ajouter... et allez chercher l'exécutable qmake se trouvant dans C:\Qt5.5\Src\qtbase\bin. Dans l'onglet Kits, ajouter un nouveau kit avec la version de Qt précédemment ajoutée : qtcreator

7. Compiler mon application Qt en STATIC

Vous n'avez plus qu'à sélectionné le kit STATIC précédemment ajouté pour votre projet d'application Qt, en mode Release (pas de mode debug en STATIC). Et voilà, vous avez finit ! 🙂

Sources : https://www.youtube.com/watch?v=Oyb20BAgx0U

20 réponses sur “Complier Qt en Static sous Windows”

  1. Bonjour,
    j'ai installé Python, la dernière version sur le site, le téléchargement se fait, l'installation aussi MAIS quand je fais "python --version", ça me le trouve pas. (alors que pour perl et ruby ça marche).
    Donc je me dis, c'est peut-être moi qui foire la commande, donc je vais plus loin, et pour la commande "configure..." ça me met "unable to detect the platform from environment".

    Comment résoudre ce souci s'il vous plaît.? Car la je ne vois vraiment pas...

    Merci d'avance de votre aide.
    Cordialement
    Isodidacte

    1. Bonjour Isodidacte,
      Lors de l'installation de Python, vous n'avez probablement pas coché la case pour ajouter python dans le PATH.
      Pour remédier à cela (sous Windows 7) :
      - Clic droit sur l'icône "ordinateur" de votre bureau (ou bien dans le panel gauche de l'explorateur de fichier)
      - Dans le menu contextuel qui apparaît, sélectionnez "Propriétés"
      - Dans la fenêtre qui s'ouvre : "Paramètres systèmes avancés" (dans la liste de gauche)
      - Dans la fenêtre ainsi ouverte, cliquez sur le bouton "Variable d'environnement..."
      - Dans la partie "Variables système", sélectionner "Path" et cliquez sur "Modifier"
      - Dans le champs "Valeurs de la variable", Ajoutez le chemin complet du dossier contenant l'exéctuable Python (Python.exe), après le dernier point virgule, et ajoutez un point virgule. Validez.
      - Maintenant, si vous tapez python dans le cmd ça devrait fonctionner 🙂

      En espérant avoir pu vous aider ! N'hésitez pas à commenter en cas d'autres problèmes !
      Floréal

        1. Ah oui en effet, je vois le problème, je l'ai déjà eu. Ajoutez ceci à votre configure :
          -platform win32-g++

          Qt n'a pas détecté tout seul que vous êtes sous Windows. Maintenant ça devrait fonctionner 🙂 J'en profite pour l'ajouter dans l'article, ça peut aider d'autres !

          Notez que cette option est correcte également pour compiler Qt sur un windows 64 bits.

          N'hésitez pas à révenir vers moi en cas d'autres problèmes... et bon courage pour la compilation, elle dure quelques heures 😉

          Floréal

          1. C'est chouette, la compilation est en marche, en avant.!
            Merci pour votre aide si efficace 😀
            et si notre discussion peut en aider d'autre ce n'est que mieux 😉

            Cordialement
            Isodidacte

  2. Si je comprends bien, vous utilisez le logiciel unrealupdater ? Car le problème semble complètement lié à ce logiciel et non à Qt lui-même.
    Pour vérifier ceci, pouvez-vous me donner les sorties de compilation de votre logiciel (onglet 4. Sortie de compilation dans Qt creator) ? Et éventuellement une copie d'écran des sorties de l'application.

  3. Enfin une procédure qui marche !! Après avoir essayé vainement les procédures trouvées sur le wiki.qt.io je désespérais de parvenir à avoir un version statique de Qt. J'avais déjà une version dynamique de Qt5.5.1 installée. J'ai téléchargé Python, Perl et Ruby, ajouté Ruby au path système. J'ai téléchargé cette version des sources de Qt : http://download.qt.io/archive/qt/5.5/5.5.1/single/qt-everywhere-opensource-src-5.5.1.7z que j'ai décompressé dans un répertoire X/static/src où X est le répertoire de base de Qt5.5.1 et j'ai appliqué votre procédure à ces sources. Moins de 2 heures après, j'ai configuré QtCreator et compilé en static+release une grosse appli qui gère plusieurs fenêtres de simulations avec affichage graphique, certaines en openGL et d'autres en Qt. TOUT À MARCHÉ. MERCI pour ce tuto.

  4. J'y étais presque, mais à la compilation, j'ai eu l'erreur suivante:

    09:26:15: Exécution des étapes pour le projet GenerationConfigEEPROM...
    09:26:15: Débute : "C:\Qt\5.11.0\Src\qtbase\bin\qmake.exe" C:\Users\fvansteenkiste\Documents\SRC14\Tools\EEPROM_Tools\GenerationConfigEEPROM\GenerationConfigEEPROM.pro -spec win32-g++
    Project MESSAGE: This project is using private headers and will therefore be tied to this specific Qt module build version.
    Project MESSAGE: Running this project against other versions of the Qt modules may crash at any arbitrary point.
    Project MESSAGE: This is not a bug, but a result of using Qt internals. You have been warned!
    09:26:17: Le processus "C:\Qt\5.11.0\Src\qtbase\bin\qmake.exe" s'est terminé normalement.
    09:26:18: Impossible de démarrer le processus "mingw32-make.exe" qmake_all
    Erreur lors de la compilation/déploiement du projet GenerationConfigEEPROM (kit : Desktop Qt 5.11.0 MinGW 32bit Static)
    When executing step "qmake"
    09:26:18: Temps écoulé : 00:03.

    J'ai l'impression qu'il manque un paramètre à ma configuration de compilation mais lequel ?

  5. Avez-vous bien installé mingw32 avec Qt lors de l'installation ? (dans l'architecture de Qt - 32 bit si qt est 32 bit ou 64 bit sinon).

    Si vous tapez mingw32-make dans la console, est-ce que ce script existe bien ?

    1. Oui, j'avais bien sélectionné mingw32 avec Qt lors de l’installation.
      Comment fait-on pour savoir si l'architecture de Qt est 32 bits ou 64 ?

      Si je tape mingw32-make dans la console j'obtiens la réponse suivante :
      mingw32-make: *** No targets specified and no makefile found. Stop.

      Donc le script existe bel et bien.

  6. En fait à l'heure actuelle j'arrive à compiler en dynamique mais pas en statique. (Après avoir suivi le tutoriel j'ai réinstallé Qt pour avoir deux répertoire compiler, un en statique, l'autre en dynamique)

    Je remarque que quand on configure le projet, en dynamique la ligne Make indique l'adresse où le projet a été compilé; mais si je sélectionne la version statique la ligne Make n'indique rien.
    Où diable est-il définis ce qu'indique la ligne Make ?

  7. J'ai aussi essayé en allant directement dans mon répertoire "build" et en appelant "mingw32-make.exe" mais la compilation plante au moment où il essaie d'inclure

  8. Ok, c'est étrange tout ça... peut-être que c'est lié à la version de Qt. Je referai un essai dès que j'ai du temps et je vous tiendrai au courant à ce moment là.

  9. J'ai refait un essai aujourd'hui et étrangement le message d'erreur a changé :

    In file included from ..\..\main.cpp:1:0:
    ..\..\HMI/MainWindow.h:4:10: fatal error: QtWidgets: No such file or directory
    #include
    ^~~~~~~~~~~
    compilation terminated.

    Encore une fois si je compile en dynamique ça passe mais en static, il n'y a rien à faire ...

  10. Pour l'aider à trouver les bibliothèques j'ai ajouté les lignes suivantes dans mon fichier *.pro :
    INCLUDEPATH += C:\Qt\5.11.0_Static\Src\qtbase\include\QtWidgets \
    C:\Qt\5.11.0_Static\Src\qtbase\include \
    C:\Qt\5.11.0_Static\include\QtCore

    Mais c'est à l'édition des liens que j'ai un problème maintenant, j'ai une foule de "undefined reference" ...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *