2009-06-01 13 views
16

Je développe une application Qt multi-plateforme. C'est un freeware mais pas open-source. Par conséquent, je veux le distribuer en tant que binaire compilé.Comment faire une distribution binaire de l'application Qt pour Linux

Sur Windows il n'y a pas de problème, je compile mon exe compilé avec MinGW et les DLL de Qt et tout va bien.

Mais sur Linux il y a un problème car l'utilisateur peut avoir des bibliothèques partagées dans son système très différentes des miennes.

Le guide de déploiement Qt suggère deux méthodes: la liaison statique et l'utilisation de bibliothèques partagées. Le premier produit un énorme exécutable et nécessite également des versions statiques de nombreuses bibliothèques dont Qt dépend, c'est-à-dire que je vais devoir tout reconstruire à partir de zéro. La deuxième méthode est basée sur la reconfiguration de l'éditeur de liens dynamiques juste avant le démarrage de l'application et me semble un peu compliquée. Est-ce que quelqu'un peut partager son expérience dans la distribution d'applications Qt sous Linux? Quelle méthode devrais-je utiliser? Quels problèmes puis-je affronter? Existe-t-il d'autres méthodes pour faire ce travail?

Répondre

12

Vous pouvez également distribuer des bibliothèques partagées Qt sous Linux. Ensuite, demandez à votre logiciel de charger ceux-ci au lieu de ceux par défaut du système. Les bibliothèques partagées peuvent être écrasées à l'aide de la variable d'environnement LD_LIBRARY_PATH. C'est probablement la solution la plus simple pour vous. Vous pouvez toujours changer cela dans un script wrapper pour votre exécutable.

Vous pouvez également spécifier la version de bibliothèque minimale que vos utilisateurs doivent avoir installée sur le système.

3

Pas une réponse en tant que telle (sybreon couvert que), mais s'il vous plaît noter que vous n'êtes pas autorisés à distribuer votre binaire s'il est lié statiquement contre Qt, sauf si vous avez acheté une licence commerciale, sinon la totalité de votre chute binaire sous la GPL (ou vous êtes en violation de la licence de Qt.)

Si vous avez une licence commerciale, tant pis.

Si vous ne disposez pas d'une licence commerciale, vous avez deux options:

  1. Lien dynamiquement contre Qt v4.5.0 ou plus récent (les versions LGPL - vous ne pouvez pas utiliser les versions précédentes, sauf en open applications source), ou

  2. Ouvrez votre code source.

4

Lorsque nous distribuons des applications Qt sur Linux (ou vraiment des applications qui utilisent des bibliothèques partagées) nous embarquons un arbre de répertoire contenant l'exécutable réel et script d'emballage associé en haut avec des sous-répertoires contenant les bibliothèques partagées et L'avantage de cela est que vous pouvez faire en sorte que le script wrapper configure tout ce dont vous avez besoin pour exécuter l'application sans avoir à vous inquiéter que l'utilisateur définisse des variables d'environnement. , installer à un emplacement spécifique, etc Si cela est fait correctement, cela vous permet également de ne pas avoir à vous soucier d'où vous appelez l'application, car il peut toujours d les ressources.Nous prenons cette structure arborescente encore plus loin en plaçant toutes les bibliothèques exécutables et partagées dans les sous-répertoires platform/architecture afin que le script wrapper puisse déterminer l'architecture locale et appeler l'exécutable approprié pour cette plateforme et définir les variables d'environnement pour trouver les bibliothèques partagées appropriées. Nous avons trouvé cette configuration particulièrement utile lors de la distribution pour plusieurs versions différentes de Linux partageant un système de fichiers commun. Tout cela étant dit, nous préférons toujours construire statiquement lorsque cela est possible, les applications Qt ne font pas exception à la règle. Vous pouvez certainement construire avec Qt statiquement et vous ne devriez pas avoir à construire beaucoup de dépendances supplémentaires comme krbyrd noté dans sa réponse.

3

sybreon's answer est exactement ce que j'ai fait. Vous pouvez toujours ajouter vos bibliothèques à LD_LIBRARY_PATH ou vous pouvez faire quelque chose d'un peu plus de fantaisie:

Configurez vos bibliothèques Qt livrées une par répertoire. Écrivez un script shell, faites-le exécuter ldd sur l'exécutable et grep pour 'not found', pour chacune de ces bibliothèques, ajoutez le répertoire approprié à une liste (appelons-le $ LDD). Après les avoir tous, exécutez le binaire avec LD_LIBRARY_PATH défini sur sa valeur précédente plus $ LDD.

Enfin un commentaire sur "Je vais devoir tout reconstruire à partir de zéro". Non, vous ne devrez pas. Si vous avez les paquets de développement pour ces bibliothèques, vous devriez avoir des fichiers .a, vous pouvez les lier statiquement par rapport à ceux-ci.

-1

Cet article contient des informations sur le sujet. Je vais essayer moi-même: http://labs.trolltech.com/blogs/2009/06/02/deploying-a-browser-on-gnulinux/

En quelques mots:

  • Configurer Qt avec -platform linux-lsb-g ++
  • Linking doit être fait avec -lsb-usage par défaut de liaison
  • tout empaqueter et déployer (aura besoin quelques modifications ici, mais je ne l'ai pas encore essayé désolé)
15

Bibliothèques partagées est la voie à suivre, mais vous pouvez éviter d'utiliser LD_LIBRARY_PATH (ce qui implique l'exécution de l'application en utilisant un script shell lanceur, etc) construisant votre binaire avec l'indicateur de compilation -rpath, en pointant là vous stockez vos bibliothèques. Par exemple, je stocke mes bibliothèques soit à côté de mon binaire, soit dans un répertoire appelé "mylib" à côté de mon binaire. Pour utiliser sur mon fichier QMake, ajouter cette ligne dans le fichier .pro:

QMAKE_LFLAGS += -Wl,-rpath,\\$\$ORIGIN/lib/:\\$\$ORIGIN/../mylib/ 

Et je peux courir mes binaires avec mes bibliothèques locales supplante la bibliothèque système, et sans avoir besoin d'un script de lancement.

0

Vous pouvez regarder dans le dossier QtCreator et l'utiliser comme un exemple. Il a qt.conf et qtcreator.sh fichiers dans QtCreator/bin.

lib/qtcreator est le dossier contenant toutes les bibliothèques Qt * .so requises. Le chemin relatif est défini dans qtcreator.sh, qui devrait être redésigné à you-app-name.sh

importations, plugins, QML sont à l'intérieur répertoire bin. Le chemin d'accès est défini dans le fichier qt.conf. Ceci est nécessaire pour le déploiement des applications QML.

1

La manière la plus facile de créer un package d'application Qt sous Linux est probablement linuxdeployqt. Il rassemble tous les fichiers requis et vous permet de construire un AppImage qui fonctionne sur la plupart des distributions Linux.

Assurez-vous de créer l'application sur la version Ubuntu LTS la plus ancienne encore prise en charge afin que votre AppImage puisse être répertorié sur AppImageHub.