Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS DELPHI F.A.Q DELPHI TUTORIELS DELPHI LIVRES COMPOSANTS SOURCES DEFI TELECHARGEZ DELPHI TV

Déployer une application Kylix

Date de publication : Rev3. 22/11/2002

Par Eric Sibert (Chez Eric Sibert)
 

Outils utilisés : Kylix 2
Domaine d'application : Kylix 1, 2 et 3


Introduction
Problèmes
Solution pratique
Problèmes avec Libqt
Problème de langue
Remarques


Introduction

Vous venez de développer une petite application sous Kylix et vous voulez maintenant la distribuer, par exemple sur Internet. Nous allons voir dans la suite de cet article une méthode pour distribuer une application en minimisant les manipulations pour l'utilisateur final.


Problèmes

Vous disposez du fichier exécutable de votre programme appelé MonProg. Et vous essayez de l'exécuter depuis la ligne de commande :

./MonProg ./MonProg: error while loading shared libraries: libqtintf-6.5-qt2.3.so: cannot open shared object file: No such file or directory
Et vous voyez apparaître le message d'erreur ci-dessus. Il manque donc une librairie partagée, l'équivalent d'une DLL sous Windows. Sauf que la gestion de ces librairies est bien différente sous Linux, comparée à Windows. Sous Windows, on met tout dans Windows/System, le programme va automatiquement y rechercher les librairies dont il a besoin et on prie très fort pour qu'il n'y ait pas de problème entre les différentes versions (prière hélas bien inutile). Sous Linux, l'approche est beaucoup plus explicite dans le sens où il faut tout indiquer, notamment quel fichier prendre quand on a besoin d'une librairie donnée et à quel endroit trouver ce fichier. On peut ainsi avoir plusieurs versions d'une librairie qui cohabitent sans perturbation. Tout le contraire de ComCtl32.dll sous Windows :-)))
Revenons à MonProg. MonProg a donc besoin d'un certain nombre de librairies. Des détails peuvent d'ailleurs être trouvés dans le fichier DEPLOY qui se trouve dans le dossier de Kylix. Mais en pratique, une commande de Linux permet de connaître rapidement les besoins. Il s'agit de ldd :

ldd ./MonProg /lib/libNoVersion.so.1 => /lib/libNoVersion.so.1 (0x40018000) libqtintf-6.5-qt2.3.so => not found libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40024000) libpthread.so.0 => /lib/libpthread.so.0 (0x40107000) libdl.so.2 => /lib/libdl.so.2 (0x4011d000) libc.so.6 => /lib/libc.so.6 (0x40120000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Nous avons une petite collection de librairies. La plupart sont déjà disponibles dans la majorité des distributions Linux. Seule une librairie manque : libqtintf-6.5-qt2.3.so. Pour cause, c'est une librairie spécifique de Borland pour assurer la liaison entre la CLX et QT. Vous devez donc impérativement distribuer cette librairie.
A titre d'entraînement, commençons par mettre en œuvre cette librairie localement. Dans le dossier HOME de l'utilisateur courant, créez un dossier /MonProg. Copiez l'exécutable MonProg dedans. Puis allez dans /Kylix2/bin et copiez libqtintf-6.5.0-qt2.3.so dans /MonProg. C'est ce fichier qui sera utilisé pour la librairie manquante. Vous observerez qu'il y a une différence entre le nom demandé et le nom réel. Vous devez donc indiquer qu'il faut prendre le fichier libqtintf-6.5.0-qt2.3.so lorsqu'on a besoin de libqtintf-6.5-qt2.3.so. Ce renvoi se fait à l'aide d'un lien symbolique. Pour créer un lien symbolique, en ligne de commande, placez vous dans le dossier /MonProg et tapez :

ln -s libqtintf-6.5.0-qt2.3.so libqtintf-6.5-qt2.3.so
Nous avons indiqué quel fichier prendre pour la librairie. Il nous reste à indiquer où prendre ce fichier. Pour trouver une librairie, le chargeur de librairies commence par explorer les dossiers stockés dans la variable LD_LIBRARY_PATH. La commande $LD_LIBRARY_PATH vous donne la liste des dossiers utilisés. Par défaut, le dossier courant n'est pas inclus. L'ajout en ligne de commande se fait comme suit :

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
export n'est normalement pas utile. La modification de LD_LIBRARY_PATH s'applique normalement à toutes les instructions suivantes du shell. J'ai toutefois vu un cas où la modification n'était prise en compte par mon application que si export était ajouté avant.
./ pour le répertoire courant
$LD_LIBRARY_PATH l'ancien contenu de LD_LIBRARY_PATH auquel on ajoute donc le répertoire courant.
On remarque au passage que le répertoire courant est ajouté au début. Les librairies seront donc recherchées d'abord dans le répertoire courant, évitant les risques de confusion si plusieurs versions cohabitent.
Cette fois, tout doit être prêt. Un nouveau test avec ldd :

ldd ./MonProg /lib/libNoVersion.so.1 => /lib/libNoVersion.so.1 (0x40018000) libqtintf-6.5-qt2.3.so => ./libqtintf-6.5-qt2.3.so (0x4001a000) libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x401c6000) libpthread.so.0 => /lib/libpthread.so.0 (0x402a9000) libdl.so.2 => /lib/libdl.so.2 (0x402bf000) libc.so.6 => /lib/libc.so.6 (0x402c2000) libqt.so.2 => /usr/lib/libqt.so.2 (0x403d5000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40893000) libm.so.6 => /lib/libm.so.6 (0x408a1000) libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x408bf000) libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x408c9000) libpng.so.2 => /usr/lib/libpng.so.2 (0x408e1000) libz.so.1 => /lib/libz.so.1 (0x4090c000) libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x4091b000) libmng.so.0 => /usr/lib/libmng.so.0 (0x4093a000) libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x4097a000) liblcms.so.1 => /usr/lib/liblcms.so.1 (0x409c3000)
Il ne manque plus rien. Vous pouvez d'ailleurs tester MonProg en ligne de commande et ça doit fonctionner.
Nous venons de voir la mise en œuvre manuelle de l'ensemble des étapes nécessaires au fonctionnement d'une application Kylix élémentaire.


Solution pratique

Nous allons maintenant voir comment appliquer ces étapes chez l'utilisateur. Pour ceci, nous aurons recours à un script qui va automatiser ces étapes. Le script doit :

  • créer le lien symbolique
  • ajouter le dossier de la libraire dans LD_LIBRARY_PATH
  • démarrer le programme
Pour simplifier le script, nous imposeront à l'utilisateur que tous les fichiers soient dans le même dossier, $HOME/MonProg par exemple. Le script, que vous appellerez startMonProg.sh, aura alors l'allure suivante :

#!/bin/sh ln -s $HOME/MonProg/libqtintf-6.5.0-qt2.3.so $HOME/MonProg/libqtintf-6.5-qt2.3.so export LD_LIBRARY_PATH=$HOME/MonProg/:$LD_LIBRARY_PATH $HOME/MonProg//MonProg
Vous n'avez plus qu'à envoyer ce script, libqtintf et votre programme à l'utilisateur, en faisant un petit paquet avec une archive tar.gz. Un nouveau script pour automatiser cette tâche est le bienvenu :

#!/bin/sh cd $HOME tar -czf MonProg/MonProg.tar.gz MonProg/libqtintf-6.5.0-qt2.3.so MonProg/startMonProg.sh MonProg/MonProg
Vous n'avez plus qu'à envoyer MonProg.tar.gz à vos utilisateurs en leur indiquant de le décompresser dans le répertoire HOME de l'utilisateur avec la commande effectuée dans le répertoire HOME

tar -xzf MonProg.tar.gz
Les fichiers vont automatiquement se mettre dans $HOME/MonProg. Puis un click sur startMonProg.sh et ça roule. J'ai fait des essais sur la Debian d'un collègue de boulot et ça marche.


Problèmes avec Libqt

En fait, ça ne roule pas toujours aussi bien que ça. Certaines distributions (Mandrake 8.0 à 8.2 et RedHat 7.0 à 7.3 à ma connaissance) ont été compilées avec une version non-officielle de gcc. Cette version de gcc ne respecte pas complètement les normes sur les formats des librairies. Ceci peut conduire à des incompatibilités. Et vous rencontrez une de ces incompatibilités avec libqt.so.2, librairie nécessaire aux applications de Kylix. Pour contourner ce problème, vous devez fournir votre propre version de libqt, en allant la chercher dans $HOME/Kylix2/bin. Et c'est lourd, car votre fichier tar.gz va passer de 800 ko à 3,6 Mo. Plusieurs solutions s'offrent à vous :

  • vous mettez libqt en téléchargement séparé et vous dites aux utilisateurs des distributions précédentes de se débrouiller
  • vous incluez d'office libqt (pour une diffusion par CD par exemple)
  • vous faites deux versions de votre archive, une avec, l'autre sans libqt
Nous allons voir en détail la dernière solution. Vous avez donc deux scripts de démarrage :

startcourt.sh (le même qu'avant)
#!/bin/sh ln -s $HOME/MonProg/libqtintf-6.5.0-qt2.3.so $HOME/MonProg/libqtintf-6.5-qt2.3.so export LD_LIBRARY_PATH=$HOME/MonProg/:$LD_LIBRARY_PATH $HOME/MonProg//MonProg
et

startlong.sh
#!/bin/sh ln -s $HOME/MonProg/libqtintf-6.5.0-qt2.3.so $HOME/MonProg/libqtintf-6.5-qt2.3.so ln -s $HOME/MonProg/libqt.so.2.3.0 $HOME/MonProg/libqt.so.2 export LD_LIBRARY_PATH=$HOME/MonProg/:$LD_LIBRARY_PATH $HOME/MonProg//MonProg
A quoi on ajoute deux scripts pour la compression, en sélectionnant la bonne version des scripts précédents :

tarcourt.sh
#!/bin/sh cp $HOME/MonProg/startcourt.sh $HOME/MonProg/startMonProg.sh cd $HOME tar -czf MonProg/MonProgCourt.tar.gz MonProg/libqtintf-6.5.0-qt2.3.so MonProg/startMonProg.sh MonProg/MonProg
et

tarlong.sh
#!/bin/sh cp $HOME/MonProg/startlong.sh $HOME/MonProg/startMonProg.sh cd $HOME tar -czf MonProg/MonProgLong.tar.gz MonProg/libqtintf-6.5.0-qt2.3.so MonProg/startMonProg.sh MonProg/MonProg MonProg/libqt.so.2.3.0
L'exécution de ces deux scripts génère deux fichiers tar.gz que vous n'avez plus qu'à distribuer. Ainsi, les incompatibilités de certaines distributions n'empêchent pas la distribution des applications développées avec Kylix mais alourdissent un peu le travail.

Depuis, j'ai changé de méthode car j'en avais marre de passer des heures à télécharger les mises à jour de mes logiciels sur mon site web avec mon modem à 56K. Je ne fais plus qu'une seule version, la version légère. Mais dans le script de démarrage de la version légère, je mets en commentaire la création du lien symbolique vers libqt :

#!/bin/sh ln -s $HOME/MonProg/libqtintf-6.5.0-qt2.3.so $HOME/MonProg/libqtintf-6.5-qt2.3.so # ln -s $HOME/MonProg/libqt.so.2.3.0 $HOME/MonProg/libqt.so.2 export LD_LIBRARY_PATH=$HOME/MonProg/:$LD_LIBRARY_PATH $HOME/MonProg//MonProg
Et je mets dans la documentation du logiciel qu'en cas de besoin, il faut aller chercher libqt sur la page correspondante de mon site web et retirer le # du script de démarrage.


Problème de langue

J'ai constaté des problèmes avec les caractères accentués. Dans certains cas, l'affichage des textes s'arrêtait au niveau des accents. Après investigation, il s'est avéré que la langue sélectionnée n'était pas le Français. Alors, par sécurité, forcez l'utilisation du Français dans le script de démarrage avec export LANG=fr_FR :

#!/bin/sh ln -s $HOME/MonProg/libqtintf-6.5.0-qt2.3.so $HOME/MonProg/libqtintf-6.5-qt2.3.so export LD_LIBRARY_PATH=$HOME/MonProg/:$LD_LIBRARY_PATH export LANG=fr_FR $HOME/MonProg//MonProg

Remarques

Pour la désinstallation, les utilisateurs doivent simplement supprimer le dossier MonProg.

Pour les applications faites avec Kylix 1 et Kylix 3, je n'ai pas fait d'essais. Les librairies libqt et libqtintf n'ont pas tout à fait les mêmes noms ou numéros de version. Il faut adapter les scripts à ces différences.

Je n'ai pas parlé des paquets d'installation (rpm ou deb). Ceux-ci permettent d'automatiser les étapes d'installation/désinstallation. Mais comme ils ne sont pas unifiés, une solution à base de paquets sera moins universelle qu'avec des archives tar.gz.

Ma méthode d'installation tend à multiplier les librairies lorsqu'un utilisateur installe plusieurs applications Kylix. Si ce n'est pas très gênant avec libqtintf, c'est plus lourd avec libqt. Il peut être alors plus judicieux de réunir ces librairies dans un seul dossier commun à toutes les applications (du côté de /usr/local/lib) mais le déploiement s'en trouve compliqué.



Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
Responsables bénévoles de la rubrique Delphi : Nono40 et Pedro - Contacter par EMail :
Vos questions techniques : forum d'entraide Delphi - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.