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 : 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 :
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
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
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
Merci pour votre astuce, ça fonctionne maintenant, python est détecté 😀
Mais le second souci reste en place hélas, je vous fourni un screen afin que vous puissiez voir le message directement.
http://image.noelshack.com/fichiers/2016/42/1477133675-2.png
Merci d'avance de votre aide.
cordialement
Isodidacte
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
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
Bon, j'ai tout fait comme la fin du tutoriel, néanmoins ça me demande des fichiers dll pour lancer le programme et une fois que j'ai mis les fichiers demandé, ça me met cette erreur:
http://image.noelshack.com/fichiers/2016/42/1477244768-2.png
Donc je ne comprend pas le souci, j'ai bien mis la ligne de configuration, la compilation par l'invite de commande est faite sans erreurs, j'ai mis le kit et le path est bon, donc :-/
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.
(Oui je l'ai trouvé assez complet et je l'ai modifié légèrement sur sa façon de faire les MAJ)
voilà l'onglet 4 comme voulue:
http://image.noelshack.com/fichiers/2016/43/1477288648-2.png
j'ai réussi, l'application est la 😀
Merci pour votre aide précieuse 😀
Ah, bonne nouvelle ! Avec plaisir 😉
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.
Content d'avoir pu vous aider 🙂
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 ?
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 ?
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.
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 ?
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
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à.
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 ...
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" ...
Alors après avoir supprimer mon répertoire C:\Qt et réinstaller la version Qt 5.11.1 puis ensuite suivre les instructions de cette page A LA LETTRE, c'est à dire ne pas essayer de compiler Qt dans un autre répertoire que C:\Qt5.11.1\Src\qtbase\bin (je m'évertuais à vouloir compiler dans un répertoire renommé C:\Qt5.11.1_static\...) et utiliser "configure" exactement comme décrit sur cette page; j'ai réussi à avoir ma compilation en static ! Yeah !
Il ne reste plus qu'à changer le titre de "Complier Qt ..." en "Compiler Qt ..." et cette page sera parfaite. UN GRAND MERCI A FLOREAL !!!