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

 C Discussion :

Problème linkage: $LD_LIBRARY_PATH non pris en compte !


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut Problème linkage: $LD_LIBRARY_PATH non pris en compte !
    Bonjour à tous,

    Je me retrouve confronté depuis quelques jours à un problème pour le moins étrange ...

    J'ai sur ma machine (Fedora 13 x86_64) une librairie installée par défaut dans /usr/bin, dont la version est 4.3.1. Cette version étant obsolète pour un programme que je dois faire, j'ai installé la nouvelle version (5.0.2) à l'aide des sources.
    La nouvelle librarie s'est naturellement installée dans /usr/local/lib (jusque là rien d'anormal !).
    J'ai ensuite exporté la variable d'environnement LD_LIBRARY_PATH comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib
    Lorsque je compile mon prgramme normalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc main.c -o test -lgmp -lm
    la version de la librairie utilisée (accessible via une macro) que m'indique mon programme est 4.3.1 (soit l'ancienne version !)
    Bien sur, lorsque je compile en forcant la recherche de librairie dans /usr/loca/lib, la version utilisée est la bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc main.c -o test -L/usr/local/lib -lgmp -lm
    Plus étonnant encore, la fichier en-tête utilisé est dans les deux cas est celui de nouvelle version !!

    Qu'ai-je mal fait ?

    Merci de l'aide que vous pourrez m'apporter.

  2. #2
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Je pense que vu que tu n'as pas désinstallé la bibliothèque en version 4.3.1
    Si elle est placée avant la version 5.0.2 dans le path, à moins de préciser la version que tu cherches, elle sera trouvée avant (4<5).

    Une fois que ton programme a trouvé la bibliothèque, il ne va pas regarder si il en trouve une version plus récente (pourquoi faire, il a une version sous la main, après tout).

    Edit : je soupçonne que /usr/bin se trouve avant /usr/local/bin dans ton path.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    La version 4.3.1 est installée dans /usr/lib
    La version 5.0.2 est installée dans /usr/local/lib

    LD_LIBRARY_PATH est initialisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LD_LIBRARY_PATH=/usr/local/lib:/usr/lib
    Autrement dit, le path /usr/local/lib doit être traité avant /usr/lib.
    Donc la version 5.0.2 est normalement celle que le linker doit prendre !

    D'où mon problème...

    Edit: Une méthode simple aurait été de désinstaller la version 4.3.1, mais c'est impossible puisqu'elle est utilisée par plusieurs autres programmes !

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Attention, dans ton premier commentaire, tu as écrit « /usr/bin » et pas « /usr/lib » (troisième phrase).

    Il y a plusieurs possibilités :

    • La nouvelle installation a mis en place un ou plusieurs liens symboliques portant les anciens noms et pointant la nouvelle bibliothèque ;
    • L'une ou l'autre de ces bibliothèques ont un soname interne qui prend le pas sur le nom du système de fichier en cas de difficulté ;
    • Ton export LD_LIBRARY_PATH n'a pas d'effet dans l'environnement où tu exécutes ton exécutable ;
    • Le fichier /etc/ld.so.conf voit les choses différemment, également.


    Que donne ldd sur ton exécutable ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    Voici le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ldd test                                                                                                                           
            linux-vdso.so.1 =>  (0x00007fff47dff000)                                                                                                               
            libgmp.so.3 => /usr/lib64/libgmp.so.3 (0x0000003e91e00000)                                                                                             
            libm.so.6 => /lib64/libm.so.6 (0x000000318c800000)                                                                                                     
            libc.so.6 => /lib64/libc.so.6 (0x000000318c400000)
            /lib64/ld-linux-x86-64.so.2 (0x000000318c000000)
    (Tu as raison Obsidian, le /usr/bin est une erreur d'inattention... C'est bien de /usr/lib dont il s'agit)

    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export LD_LIBRARY_PATH=**
    est fait dans ~/.bashrc. Et la variable vaut bien /usr/local/lib:/usr/lib" lors d'un appel à

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Si tu récupères la version de ta lib avec une macro, c'est que la version en question est définie dans un header, pas dans la lib. Donc ton problème n'a rien à voir avec LD_LIBRARY_PATH, mais simplement avec le fait que tu ne vas pas chercher les headers au bon endroit.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut
    J'ai d'abord pensé à ca, mais ce n'est pas possible pour deux raisons :
    • la macro est définie comme étant égale à une variable qui elle est définie dans les sources même de la librairie
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      #define gmp_version __gmp_version
    • En revanche dans le header, trois macros sont définies qui définissent respectivement la version, la mineure, et le patch. Ce qui est étrange dedans, c'est qu'en imprimant ces trois macros sur la sortie standard, j'obtiens 5.0.2 !!!!!


    Donc le header pris par le compilateur est bien celui dans /usr/local/include, mais la librarie utilisée est prise dans /usr/lib(64) !!

    C'est ca qui est vraiment bizarre ...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut
    @Obsidian
    /etc/ld.so.conf voit les choses exactement comme moi, d'ailleurs je me rends compte que je n'ai même pas besoin de définir mon LD_LIBRARY_PATH, puisque /usr/local/lib et /usr/lib y sont déjà, et dans le bon ordre !

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Au fait, c'est vrai que tu nous as dit que tu tournais en x86_64 (j'ai la même distrib : F13 en x86_64).

    Dans ce cas, /lib, /usr/lib et /usr/local/lib contiennent les versions 32 bits des libs, et /lib64, /usr/lib64 et et /usr/local/lib64 les versions 64 bits.

    Et à en voir le résultat de ldd, c'est bien les versions 64 bits qui sont utilisées (normal). Si elles ne sont pas mises à jour elles-aussi, ceci explique peut-être cela.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    La nouvelle version que j'ai installée est bien une version 64 bits, j'ai à l'instant recompilé les sources, et l'option gcc '-m64' apparait bien sur toutes les lignes de compilation...

    Il est vrai que par défaut les librairies compilées par mes soins s'installent automatiquement dans /usr/local/lib (Je dois peut être avoir un 'melting pot' de librairies 32 et 64 bits dedans, à vérifier), donc mon problème ne vient pas de là...

    On m'a dernièrement fait part d'une précision que je ne connaissais pas sur les systèmes UNIX, mon problème vient peut être de là, mais je n'ai toujours pas réussi à le régler : l'outil (ld) permettant l'édition de liens à la compilation est différent de l'outil (ld.so) liant l'exécutable à la librarie au moment de l'exécution !
    Mn ami google m'a, quant à lui, appris l'existence de la variable d'environnement LIBRARY_PATH (à ne pas confondre avec LD_LIBRARY_PATH !!), dont la définition semble résoudre mon problème, mais sa modification n'a rien changé, peut être une erreur de ma part...

    Merci de l'aide que vous pourrez m'apporter.

Discussions similaires

  1. CSS non pris en compte problème d'affichage !
    Par clementdevelop dans le forum Mise en page CSS
    Réponses: 21
    Dernier message: 13/05/2013, 09h53
  2. Réponses: 4
    Dernier message: 29/06/2012, 11h44
  3. Réponses: 4
    Dernier message: 10/11/2010, 23h01
  4. Réponses: 1
    Dernier message: 09/04/2010, 21h02
  5. [event] keyListener non pris en compte
    Par pierre.zelb dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 03/08/2005, 09h35

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