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 :

Librairies imbriquées


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 11
    Par défaut Librairies imbriquées
    Bonjour à tous,

    Voici mon problème:
    J'ai deux librairies dynamique libA.so et libB.so.

    libB.so à été linkée avec libA.so à la compilation (option -lA).

    Il faut savoir que libA et libB contiennent certaines definition de fonction qui sont les mêmes (je sais c'est tordu mais je n'ai pas le choix, on me les livre comme ca).

    Donc pour que mon programme fonctionne je le link en utilisant uniquement l'option -lB. Comme ca je suis sur d'appeler les fonction de la librairies B et si jamais B a besoin de certaines fonctions de A elle la charge. Et ca fonctionne.

    Maintenant il me faut integrer (et je n'ai toujours pas le choix!) ces deux libraries A et B dans une libraries C qui elle sera utilisé par mon programme.
    Donc je me dis pas de probleme: je compile ma libC.so avec -lB et mon prog avec -lC et tout s'enchaine. Sauf que ca ne marche pas.

    Le seul moyen que j'ai trouvé pour avoir quelque chose qui tourne c'est de compiler la libC avec -lA ET -lB (et dans cet ordre seulement en plus)!!

    Et cette solution m'ennuie car comme je l'ai dit plus haut il y a des fonctions communes a ces 2 libraries. Et donc quand mon programme aura besoin d'une de ces fonctions, comment être sur que j'appelle bien celle de la libB et non celle de la libA??

    Je ne comprend pas bien comment ca fonctionne...

    Merci pour votre aide...

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Librairies imbriquées
    Citation Envoyé par Harzoglups
    Bonjour à tous,

    Voici mon problème:
    J'ai deux librairies dynamique libA.so et libB.so.

    libB.so à été linkée avec libA.so à la compilation (option -lA).

    Il faut savoir que libA et libB contiennent certaines definition de fonction qui sont les mêmes (je sais c'est tordu mais je n'ai pas le choix, on me les livre comme ca).
    C'est très mal de mettre des fonctions qui ont le même nom dans 2 bibliothèques que l'on doit lier ensemble. C'est une erreur de conception.

    D'ailleurs au link ça devrait râler (doubles définitions).

    Ceci dit, il est possible (voir options du link) que la manip soit autorisée et que les fonctions réellement appelées soient les premières chargées. Si c'est le cas, attention à l'ordre de chargement des bibliothèques.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 11
    Par défaut
    Comme j'ai bien pris la peine de le préciser, je n'y suis pour rien.
    On me livre les libraries tel quel et il faut que je m'en debrouille.
    Maintenant, je suis bien d'accord avec toi, c'est n'importe quoi!!

    Pour l'ordre je suis assez d'accord mais ce que je ne comprend pas c'est pourquoi ma facon de faire ne fonctionne pas: compiler avec -lC mon prog, compiler ma libC avec juste -lB (puisqu'a priori la libB a déjà été compilé avec -lA).

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 11
    Par défaut
    Sinon, est-ce que quelqu'un sait se servir de ltrace?
    J'ai vu dans le man que ca servait a tracer les appels au librairies mais en pratique dans le fichier de sortie (j'ai essayé pas mal d'options) je trouve tout un tas de bazar mais pas une seule fois le nom des libraires que j'utilise!!!
    En gros ce que j'aimerais savoir c'est: dans quel librairie tel fonction à été appelée...

    Merci.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 11
    Par défaut
    Bon j'ai resolu mon probleme.

    En gros mon étape finale consistait a compiler mon binaire avec un -lC. Du moins je pensais que ca fonctionnait comme ca...

    Mais en fait non, on passe par un dlopen("libC") plutot que par un -lC.
    C'etait la cause de mes soucis!

    En effet passer par un dlopen fait que le binaire ne connait plus "statiquement" ses dependances (un readelf sur le binaire avec dlopen ne laisse plus apparaitre le NEEDED:libC.so contrairement au -l). C'est mon interpretation mais ce n'est pas ultra clair dans ma tête: cf la suite.

    Ca ammène donc d'autres interrogations: quel est l'interet du dlopen par rapport au -l du coup???
    Ca permet de faire du dlsym pour récupérer des symboles, d'accord, mais autant faire un -l et utiliser ces symboles directement qui seront chargés à l'éxécution non?


    Merci de m'eclaircir un peu les idées!!!

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 11
    Par défaut
    Hé hé, je l'aime bien ce sujet! Je me pose des questions, je me repond...

    Bon alors l'interêt d'un dlopen dans mon cas je l'ai trouvé.
    En effet je souhaite linker mon binaire avec la librarie libC.so mais en fait ce n'est pas tout a fait vrai: mon binaire peut utiliser soit libC.so soit disons libC1.so. Ce choix de librairies est fait dynamiquement à l'éxécution via un fichier de conf!

    Donc je ne peux pas linker à l'avance a la compile avec l'une ou l'autre lib vu que je ne sais pas à
    l'avance laquelle sera utilisée!

    Moralité, les choses s'eclaircissent mais je retrouve mon problème de départ

    Bon ben je me dis à bientôt alors!

Discussions similaires

  1. Pb requête imbriquée
    Par ddams dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/04/2004, 12h13
  2. Réponses: 5
    Dernier message: 09/12/2002, 22h23
  3. [GTK]PB Librairie GTK+ sous dev-c++
    Par wozzy dans le forum Dev-C++
    Réponses: 15
    Dernier message: 05/11/2002, 14h55
  4. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15
  5. compatibilité des librairies directX8
    Par Freakazoid dans le forum DirectX
    Réponses: 3
    Dernier message: 23/05/2002, 21h33

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