IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

[Déploiement] Export d'un exe, sh, bin, etc.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 65
    Points : 41
    Points
    41
    Par défaut [Déploiement] Export d'un exe, sh, bin, etc.
    Bonjour,

    Je viens du monde Java et j'aimerais me documenter en vue de créer une application Qt. Je me tourne vers Qt pour son côté multi plateforme, mais également parce que c'est un framework (a priori) bien rodé.
    J'ai déjà fait un petit peu de c++, notamment avec Juce sous Visual Studio.

    Pour me faire la main, j'ai donc installé Qt creator sur ma machine (Windows), et testé un "Hello world" fenêtré. Tout fonctionne nikel.
    Comme mon but n'est pas de contempler mon application uniquement sur ma machine, et buildée avec Qt creator, j'ai cherché un bouton "exporter en .exe", en vain. J'ai ensuite cherché dans la doc, en vain.
    J'ai donc cherché sur Google, et je tombe sur une dizaine de threads dans des forums, dont certains datent de 2010, et la plupart n'ont pas de réponse définitive.
    Je vois que dans la FAQ ici (http://qt.developpez.com/faq/?page=g...ws-deploiement), il y a à peu près les mêmes instructions que dans les forums ("prendre les .dll de mingw au peu au hasard, dans un dossier qui n'est pas toujours le même, et regarder si ça marche").
    D'ailleurs la FAQ ici est écrite pour Qt4, actuellement on est en Qt5.

    Ma question est donc la suivante: y a-t-il un moyen simple et industrialisable de créer un .exe distribuable sur n'importe quelle plateforme qui n'a pas Qt, ni Qt creator? Sans vouloir troller, dans Eclipse Java, un click droit sur le projet, et on l'exporte en Jar, en 2 secondes ça fonctionne (vient ensuite le problème de la JVM d'exécution, mais c'est un autre problème).
    D'autant que quand je builde mon projet sous Qt creator, il logge bien "launching project from C:/dev/.../myproject.exe", ça veut donc bien dire qu'il arrive à savoir exactement de quelles dll mon projet a besoin, non?
    Je trouverais ça incroyable que tant de monde développe sous Qt et se fasse ch... à faire des copier/coller de .dll pour exporter son projet. Comment font les entreprises?

    Question subsidiaire: y a-t-il un moyen de faire la même chose simplement pour les Unix? Sortir un .sh ou un .bin? Je sais que pour iOs et Android c'est plus compliqué, mais assez bien expliqué dans la doc.

    Merci pour votre lecture de ce long post, et pour vos réponses.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Points : 698
    Points
    698
    Par défaut
    Au boulot, on fait simple : tout est généré automatiquement par un CI jenkins. Parce que toute façon, un "livrable client", ce n'est pas juste un .exe et quelques dll (tout comme ce n'est pas juste un .jar). Du coup, pas besoin de juste un bouton pour cela (Qt Creator est un projet open source, donc tout le monde peut créer un plugin pour déployer une application Qt. Si cela n'existe pas, c'est que tout le monde s'en moque)
    Idem pour linux, iOS et Android, de simples scripts et c'est bon

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    Hello,

    Merci pour ta réponse.
    C'est bien ça que j'avais en tête: si c'est difficile de créer un livrable standalone sur sa machine, alors ça doit être encore moins envisageable de faire de l'intégration continue.
    Je suis d'accord pour dire qu'un livrable client ce n'est pas juste un .jar, mais quand tu as le .jar, tu as déjà fait 80% du boulot. En quelques clics c'est fait sous n'importe quel IDE Java.

    tout le monde peut créer un plugin pour déployer une application Qt. Si cela n'existe pas, c'est que tout le monde s'en moque
    Là je suis un peu moins d'accord: tout le monde ne s'en moque pas, c'est pour ça qu'on trouve des dizaines de threads dans des forums sur ce thème-là. Curieusement je n'ai encore jamais vu de réponse arrêtée. C'est peut-être une question de gros débutant.
    Sur une des premières pages du site Qt (http://doc.qt.io/qt-5/topics-app-development.html), il y a marqué: "Qt is designed for developing applications and user interfaces once and deploying them across several desktop and mobile operating systems", mais je n'ai pas trouvé sur le même site comment faire ce "deploying them across several desktop".

    Question: Du coup, que fait votre job Jenkins? Il récupère les .dll nécessaires, l'exe du programme, et colle tout ça dans un répertoire? Si Jenkins est installé sur un Unix (95% des cas je pense), où va-t-il chercher les .dll? Et comment faire si on veut builder pour un système Unix?

    Merci de vos réponses, j'aimerais y voir clair avant de me lancer dans un gros dev.

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 107
    Points : 189
    Points
    189
    Par défaut
    Bonjour,

    la plupart n'ont pas de réponse définitive.
    Etrange, je lis tous les messages depuis presque 2 ans sur le forum Qt et ces questions de débutant sont généralement totalement traité.

    prendre les .dll de mingw au peu au hasard,
    Il y a aucun hasard !

    dans un dossier qui n'est pas toujours le même
    Hormis l'emplacement d'installation du SDK (choisit par l'utilisateur) et les numéros de version qui évolue, c'est le même :
    Chemin_Installation_SDK/Version_De_La_Lib_Qt/Compilateur_Et_Version_du_compilateur/bin
    Quand tu débutes, généralement tu installes le SDK de base avec une seule version de Qt et un seul compilateur. Par exemple chez moi :
    C:\Qt\5.4\mingw491_32\bin

    D'autant que quand je builde mon projet sous Qt creator, il logge bien "launching project from C:/dev/.../myproject.exe", ça veut donc bien dire qu'il arrive à savoir exactement de quelles dll mon projet a besoin, non?
    Car un programme lancé à travers Qt Creator utilise les dll de l'emplacement "C:\Qt\5.4\mingw491_32\bin".

    mais quand tu as le .jar, tu as déjà fait 80% du boulot.
    Faut quand même pas exagérer. Pour un Hello World à la rigueur.
    Non, pour un programme industriel, on crée un installateur, aussi bien pour C++/Qt que pour java, qui encapsule le .exe ou le Jar.
    Perso j'utilise InnoSetup. Il existe Qt-Installer-Framework aussi (utilisé pour l'installation du SDK Qt par exemple) mais je l'ai pas testé.
    A titre d'exemple, la copie de dll dans mes scripts d'InnoSetup représente 15 à 20 lignes. Et des lignes vraiment pas compliquées puisque c'est du copie-coller, seul le nom de la dll change. Ces lignes représentent 5% du script.
    Donc rien qui ne gène une intégration continue.

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Points : 698
    Points
    698
    Par défaut
    Je ne sais pas très bien comment fonctionne un fichier .jar, mais déployer une application, c'est aussi gérer les dépendances (autres libs utilisées, autres logiciels), la configuration système (base de registres sous windows, fichier config de linux, etc), la localisation des binaires (dans le même répertoire ou dans system pour windows, user/bin, usr/libs, usr/local, etc sous LInux), la localisation des images, des ressources en général, etc. Et cela change pour MacOSX, Android, iOS...
    Donc ce n'est pas une problématique spécifique du C++/Qt, c'est un problème de variété des systèmes.

    Jenkins est configuré pour builder, lancer les tests unitaires, l'analyse statique et dynamique, générer la doc développeur et utilisateur, générer les installateur (innoSetup sous windows, .deb/.rpm/depôts sous linux), générer les DVD d'install.
    Dans cette histoire, "trouver les dll", c'est accessoire. On configure une fois Jenkins et c'est réglé (cf le lien que j'ai donné pour trouver les dll)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Et merci pour vos réponses.

    @loupioum
    Quand je dis "la plupart des questions de ce type n'ont pas de réponse définitive sur les forums", je pense que c'est assez clair:


    De plus, je ne suis pas sûr que ce soit une question de débutant, sinon je pense que vous m'auriez déjà donné une réponse claire. Il y a 64 personnes qui ont vu cette discussion, et vous êtes 2 à me répondre.
    Quand je dis "prendre des dll au hasard", bien sûr que j'exagère, mais j'ai pu constater qu'il ne fallait pas toujours prendre les mêmes. Dans les exemples fournis avec Qt creator, il y a des exemples simples qui nécessitent peu de dll (celles de base), et d'autres qui en nécessitent beaucoup plus. Comment je l'ai su? En appuyant sur mon .exe, et en ajoutant la .dll manquante à chaque fois. Il manque 20 dll => j'appuie 20 fois sur mon exe. Pour moi c'est du bricolage (à moins que ça fasse partie de la phase d'initialisation du projet).

    J'ai vu que certains posts parlaient de http://www.dependencywalker.com/, ça m'a l'air plutôt bon, mais c'est exlusif à Windows, quid de Linux et autres?

    Et si, quand tu as le .jar tu as fait 80% du boulot, le reste c'est le paquet cadeau, le plus important c'est ce qu'il y a à l'intérieur.

    Merci pour l'info sur InnoSetup, je vais regarder ça.

    Sinon j'ai une dernière question: pour gérer tous ces problèmes de .dll, j'ai vu qu'on pouvait créer un projet linké statiquement, qu'en pensez-vous (mis à part les problèmes de licence)? J'ai l'impression que ça résout tous les problèmes, mais ça a l'air ultra compliqué.

    Merci pour vos réponses, je sais bien que C++ est bien plus complexe que Java

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Points : 698
    Points
    698
    Par défaut
    Citation Envoyé par ronchman07 Voir le message
    sinon je pense que vous m'auriez déjà donné une réponse claire. Il y a 64 personnes qui ont vu cette discussion, et vous êtes 2 à me répondre.
    Je t'ai donne un lien qui explique les DLL qu'il faut prendre. Que te faut-il d'autre ? (peut être que les 62 autres personnes n'ont rien de plus a ajouter)
    Tu as deux problèmes différents : savoir quels fichiers tu dois fournir aux utilisateurs (cf le tuto) et comment créer un paquetage (cf innoSetup). Aucun de ces 2 problèmes n'est complexe (ie ne nécessite pas d’être un expert. Un débutant peut s'en sortir, mais cela nécessite de lire un peu les tutos et docs)

    Citation Envoyé par ronchman07 Voir le message
    J'ai vu que certains posts parlaient de http://www.dependencywalker.com/, ça m'a l'air plutôt bon, mais c'est exlusif à Windows, quid de Linux et autres?
    Qt utilise des plugins chargés au démarrage de l'application, qui ne peuvent pas être détectés par dependencywalker, donc cela ne fonctionnera pas (cela fonctionnera pour les modules Qt, comme qtcore.dll ou qtgui.dll, mais pas pour qwindows.dll par exemple)

    Citation Envoyé par ronchman07 Voir le message
    Sinon j'ai une dernière question: pour gérer tous ces problèmes de .dll, j'ai vu qu'on pouvait créer un projet linké statiquement, qu'en pensez-vous (mis à part les problèmes de licence)? J'ai l'impression que ça résout tous les problèmes, mais ça a l'air ultra compliqué
    C'est remplacer un problème par un autre problème. Le build de Qt en static est assez complexe, trouver quelques dll l'est beaucoup moins.
    En général, on build en static pour diminuer la taille des livrables (mais avec les capacités actuelles des réseaux et des ordis, c'est de moins en moins utile a mon sens)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    Hello,

    Ok je pense commencer un projet et je verrai bien comment faire.
    Mon but premier: faire fonctionner un "Hello world" dans une fenêtre en standalone sur les 3 plateformes que je vise: Windows, Linux et Android.
    Si au bout d'une semaine je n'ai rien de valable, j'abandonne et je passe sur JavaFX (qui est bien moins avancé que Qt, cette solution ne me plairait pas).

    Au pire je reviendrai avec des questions moins générales, plus précises.

    Merci pour votre aide et vos pistes.

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Points : 698
    Points
    698
    Par défaut
    Tu crées un hello world avec Qt Creator (Fichier > Nouveau projet > Application Qt Widget - 2 min), tu build en release (1 min), tu lis le tuto que j'ai donné (10min a 1h, en fonction de ta vitesse de lecture), tu copies les dll et le .exe (5 min) et c'est bon. Si cela va pas, n'attends pas une semaine, passe directement sur JavaFX

    Pour Android, il te faudra installer les outils de cross-compile de Android. Tu trouveras sans problème un tuto pour Qt Android en français sur internet.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    Oui pour Android c'est (curieusement) beaucoup mieux documenté que pour les desktops Windows et Linux.

    JavaFX c'est un peu trop jeune comme techno, nativement il y a très peu de composants graphiques, et leur système CSS est aussi bugué que leur système de WebView.
    Le déploiement sur desktop est ultra simple (puissance du Java), mais par contre Android et iOs, c'est du très gros bricolage. C'est juste une évolution de Swing dans un joli paquet cadeau, mais ça ne va pas plus loin.
    Je ne suis vraiment pas fan, ce serait un échec si je devais en arriver là.

    Sur Qt, les exemples fournis avec le creator sont beaux, diversifiés. Ce qui pêche c'est sa simplicité d'utilisation, à voir avec l'usage. J'avais l'habitude de VS avec Juce, et là si je ne dis pas de bêtise, on prend de dossier "release", on le met n'importe où sur un PC, on clique sur l'exe et ça lance le programme. D'où mon inquiétude sur Qt/Qt creator.

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Points : 698
    Points
    698
    Par défaut
    A mon avis, si tu trouves que le déploiement d'applications Java est "ultra simple", c'est que tu n'as jamais travaille sur des applis pro. Les problèmes que j'ai citée ne sont pas spécifiques du langage. Et pour java, il faut ajouter les problèmes de gestion des versions de la JVM, les modules Java, etc.
    Pour Qt Android, on a aussi du "je clique sur 1 bouton et tout est fait". C'est bien pour faire la phases de développement sur ton poste de travail, mais le déploiement final (livrable aux clients), cela passe par une chaîne de build aussi.

    Pour iOS, tu risques d'avoir des problèmes si tu bosses en Java...

    Sur Qt, les exemples fournis avec le creator sont beaux, diversifiés. Ce qui pêche c'est sa simplicité d'utilisation, à voir avec l'usage. J'avais l'habitude de VS avec Juce, et là si je ne dis pas de bêtise, on prend de dossier "release", on le met n'importe où sur un PC, on clique sur l'exe et ça lance le programme. D'où mon inquiétude sur Qt/Qt creator.
    Question de point de vue. Perso, ca me gonflerait que le build s'amuse a copier toutes les dll dans le répertoire bin pour chaque projet, alors que les dll sont accessibles sans copie. Perte de temps et de mémoire. Je préfère copier les dll quand cela est nécessaire plutôt que ce soit fait systématiquement (d'autant plus que cela prend 10 lignes de code pour scripter ca)

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 107
    Points : 189
    Points
    189
    Par défaut
    Bonjour,

    Quand je dis "prendre des dll au hasard", bien sûr que j'exagère, mais j'ai pu constater qu'il ne fallait pas toujours prendre les mêmes.
    Tu peux très bien faire comme java, c'est à dire tout prendre. Un copie collé du contenu du dossier bin (C:\Qt\5.4\mingw491_32\bin dans mon cas) à la racine de ton .exe. Et c'est fini.
    La différence avec java est que Qt offre le choix de ne déployer que le nécessaire. Il y a d'ailleurs beaucoup de stratégie possible (compilation statique, dynamique, dynamique commune...)

    Maintenant, si tu veux le faire à la java, sache qu'il existe windeployqt.
    Rechercher "qt deploy" dans Google et au premier lien on tombe sur http://doc.qt.io/qt-5/windows-deployment.html.
    Et à la fin il y a la section "The Windows Deployment Tool"
    Détail en vidéo :


    Maintenant si tu veux réaliser automatiquement ce déploiement dans QtCreator :
    * Dans l'onglet Projet
    * Sélectionner son Kit (exemple "Desktop Qt 5.4.1 MinGW 32bit" dans mon cas)
    * Sélectionner le sous onglet "Exécuter"
    * Dans la section "Déploiement"
    * Cliquer sur "Ajouter l'étape Déploiement" et sélectionner "Etape personnalisée"
    * Dans cette étape personnalisée, ajouter dans les champs :
    * Commande : windeployqt.exe
    * Argument : .
    * Répertoire de travail : %{buildDir}\release

    Maintenant, quand tu exécuteras, QtCreator lancera le déploiement.
    Nom : qt.PNG
Affichages : 1138
Taille : 48,6 Ko
    Et si, quand tu as le .jar tu as fait 80% du boulot, le reste c'est le paquet cadeau, le plus important c'est ce qu'il y a à l'intérieur.
    Donc si je reprends ton résonnement, maintenant tu sera à 98% du boulot avec Qt

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    Merci, de la lecture!

    "windeployqt" ça a l'air très bon, je vais regarder tout ça chez moi ce soir (je n'ai pas d'environnement Qt au boulot, on ne fait que du Java).
    C'est pour ça que
    A mon avis, si tu trouves que le déploiement d'applications Java est "ultra simple", c'est que tu n'as jamais travaille sur des applis pro
    : si si, justement, je fais ça toute la journée, en web ou en lourd (Swing), dans un environnement bancaire. Avec jnlp et launch4j c'est assez simple tout de même (même si on a encore plein de machines sous XP).

  14. #14
    Membre à l'essai
    Profil pro
    Intégrateur
    Inscrit en
    Décembre 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 111
    Points : 18
    Points
    18
    Par défaut
    @mintho carmo

    j'ai rencontré les mêmes soucie que ronchman07, et je trouve les deploiement sur QT vraiment, mais vraiment de l'ordre du bricollage, faut pas dire que contrairement a java, dans qt on ne prend que l'essentiel, c'est juste que tu as une VDM dans ton environnement de travail, et que tu n'a jamais eu le lux dans ta vie de créer un vrai fichier POM dans maven avec que les librairie que tu utilises, de lancer une commande maven, d'aller te couler un café, puis revenir voir que ton EAR est bien créer avec les 2 war qui vont bien dedant, ainsi que tes jars qui font du traitement batch et ça mon ami, c'est du pur bonheur

    Faut savoir que faire du copier/coller de librairie c'est purement et simplement de l'amateurisme !!!

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 107
    Points : 189
    Points
    189
    Par défaut
    Faut savoir que faire du copier/coller de librairie c'est purement et simplement de l'amateurisme !!!
    C'est pourtant ce que fait aussi maven, avant l'empaquetage ! Tout comme innoSetup par exemple que j'utilise. Perso, je ne touche jamais à aucune dll. Je ne fait que préciser celle que j'ai besoin.

    de lancer une commande maven, d'aller te couler un café,
    C'est si lent que cela ? :-)

    D’ailleurs, rien ne t'empêche d'utiliser maven avec le C++. Et maven n'est pas le seul, il en existe plein d'autre outil du même genre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/12/2012, 14h28
  2. J'ai as de .exe dans bin/debug/
    Par haizara dans le forum C#
    Réponses: 5
    Dernier message: 11/07/2011, 22h28
  3. Déploiement : créer un setup.exe unique avec Framework 3.5 intégré au cas où
    Par zax-tfh dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 11/05/2009, 13h25
  4. [JavaExe] Export jar puis exe
    Par alexDe dans le forum EDI et Outils pour Java
    Réponses: 2
    Dernier message: 15/03/2009, 16h05
  5. Probleme exportation de l exe
    Par Fry dans le forum MFC
    Réponses: 4
    Dernier message: 06/01/2006, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo