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

Linux Discussion :

[g++]Compréhension globale LD_LIBRARY_PATH


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 44
    Par défaut [g++]Compréhension globale LD_LIBRARY_PATH
    Bonjour à tous!

    De ce que j'ai pu lire partout sur le net, le LD_LIBRARY_PATH permet d'indiquer lors de la compil+linking avec g++ (entre autre) où chercher certaines bibliothèques nécessaires à notre linking...

    Mon problème vient du fait que j'ai pu également lire que c'était MAL d'utiliser cette variable et qu'il valait mieux utiliser des options du style -L /path -lmaLib.

    Et effectivement cela fonctionne bien pour certaines de mes bibliothèques et pas pour d'autres...

    Dans mon projet ma ligne de linking ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/g++ -L/usr/lib -L/usr/local/python2.6/lib -lpython2.6 /monPath/malib.so -o main main.o
    Cette ligne ne me génère pas d'erreur à son exécution.
    Par contre, lorsque j'essaye d'exécuter le main généré... j'ai une erreur m'indiquant que la bibliothèque partagée python n'a pu être chargée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error while loading shared libraries: libpython2.6.so.1.0: cannot open shared object file: No such file or directory
    Il suffit que je rajoute le path vers la lib python dans mon LD_LIBRARY_PATH pour que cela fonctionne... mais je n'arrive pas à comprendre pourquoi, étant donné que je lui indique explicitement ou aller chercher cette bibliothèque. Le mécanisme semblant fonctionner pour l'autre bibliothèque (malib.so) que j'utilise...

    Bref, il me manque une brique dans le mur de ma compréhension de tout ça... si quelqu'un l'a à sa disposition, je veux bien qu'il m'éclaire

    Merci à tous!

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Le -L ne sert qu'au moment de l'édition de lien, pas à l'exécution. L'information n'est pas enregistrée dans le fichier objet produit.

    Pour spécifier le "library search path" à utiliser au moment de l'exécution, il faut utiliser l'option -rpath du linker (ld).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 44
    Par défaut
    Merci pour cette réponse, elle m'éclaire un peu, mais me fait poser une autre question...

    1/A quoi sert l'édition de lien s'il faut repréciser le path vers la librairie au moment de l'exécution?

    Pour l'option -rpath, j'ai fait des essais du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/g++ -rpath /usr/local/python2.6/lib /monPath/malib.so -o main main.o
    ...sans résultat, il lui manque toujours des infos apparemment.

    Et je viens de lire également que l'uitlisation de rPath n'était pas forcément une bonne idée parceque c'était "en dur" dans la librairie et que du coup il fallait faire attention lors des évolutions etc...

    2/C'est quoi la solution optimale finalement: LD_LIBRARY_PATH, rPath, autres?

    Encore merci pour votre aide !

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Moskito Voir le message
    Merci pour cette réponse, elle m'éclaire un peu, mais me fait poser une autre question...

    1/A quoi sert l'édition de lien s'il faut repréciser le path vers la librairie au moment de l'exécution?
    L'édition de liens sert
    1) si tu utilises des librairies statiques et non dynamique, à rapatrier dans ton exécutable tout le code des librairies que tu utilises
    2) dans le cadre de librairies dynamiques, à donner le nom de cette librairie qui sera alors chargée, lors de l'exécution, depuis son emplacement pris à partir de LD_LIBRARY_PATH
    3) dans le cas où ton code est éclaté entre plusieurs sources, à relier le code dans l'exécutable

    Citation Envoyé par Moskito Voir le message
    Pour l'option -rpath, j'ai fait des essais du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/g++ -rpath /usr/local/python2.6/lib /monPath/malib.so -o main main.o
    ...sans résultat, il lui manque toujours des infos apparemment.

    Et je viens de lire également que l'uitlisation de rPath n'était pas forcément une bonne idée parceque c'était "en dur" dans la librairie et que du coup il fallait faire attention lors des évolutions etc...

    2/C'est quoi la solution optimale finalement: LD_LIBRARY_PATH, rPath, autres?

    Encore merci pour votre aide !
    Je connaissais pas -rpath. Moi je passe toujours par LD_LIBRARY_PATH. Pour moi, s'il y a une variable alors autant s'en servir...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 44
    Par défaut
    Merci beaucoup pour ces réponses, c'est désormais plus clair à mes yeux!

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Sous Linux, il y a aussi /etc/ld.so.conf (et la commande ldconfig) si tes répertoires doivent être visibles par le système entier et installés durablement.

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

Discussions similaires

  1. Compréhension globale ordinateur
    Par saturn1 dans le forum La taverne du Club : Humour et divers
    Réponses: 15
    Dernier message: 27/08/2009, 08h53
  2. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07
  3. Fichier de fonctions globales
    Par PEM dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/07/2002, 21h35
  4. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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