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 :

Bibliothèque partagée utilisant une classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut Bibliothèque partagée utilisant une classe
    Bonjour à tous.
    Je code sous Linux une bibliothèque (libmnt) utilisant en interne une classe (MNT_Parser). Ce que j'entends par "utilise en interne" : libmnt exporte une fonction (foo) prenant en paramètres et retournant des types standarts (POD), mais utilise dans son scope un objet de type MNT_Parser.

    À l'exécution j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dlopen() : ./libmnt: undefined symbol _ZTI10MNT_Parser
    Je me doute bien qu'il s'agit d'un soucis de mangling. Mais que faire ? Dois-je préfixer tous mes symboles internes d' `extern "C"` ?

    Merci de votre aide.

  2. #2
    screetch
    Invité(e)
    Par défaut
    utilise objdump -t pour voir si ta fonction est bien la.

    attention car sous linux, les libs peuvent etre incomplètes et se résoudre seulement au runtime (des fois avec des bouts fournis par le programme qui utilise la lib). il est possible que tu aies juste oublié une définition quelque part dans la bibliotheque, ce qui ne se voit pas au link comme on le pense mais au chargement.

  3. #3
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Ma fonction est bien présente (sans décoration), mais mes classes le sont aussi sous formes décorées.

  4. #4
    screetch
    Invité(e)
    Par défaut
    mais est-ce que _ZNI10MNT_Parser est présent ?
    essate objdump -t libmnt | grep MNT_Parser

  5. #5
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Mince, je n'avais pas fait attention mais le mangling est quelque peu différent. Et mon _ZTI10MNT_Parser est bien indéfini (comme suggéré je crois dans ton premier message).

    dlopen semble chercher _ZTI10MNT_Parser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $objdump -t libmnt.so | grep "_ZTI10MNT_Parser"
    0000000              *UND*       00000000          _ZTI10MNT_Parser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    objdump -t libmnt.so | grep "MNT_Parser" | less
    ...
    00004b98 g           F  .text    0000004c          _ZN10MNT_ParserC1Ev
    ...
    00004b4c g           F  .text    0000004c          _ZN10MNT_ParserC2Ev
    ...
    Tous les membres de MNT_Parser semblent êtres présents. Il manque juste la classe (si je comprends bien).

    Edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $objdump -t libmnt.so | grep "*UND*"
    liste des éléments de la lstdc++ et lbz2 et mon _ZTI10MNT_Parser uniquement. Pour -lstdc++ et -lbz2 aucun soucis, c'est juste pour ma classe qu'il y a ennui.

    Edit2 :
    Avant de chercher à faire une bibliothèque, j'ai fait un exécutable simple et tout fonctionnait.

  6. #6
    screetch
    Invité(e)
    Par défaut
    a vue de nez je dirai que c'est la table de methode virtuelle qui manque; peut etre as tu une fonction virtuelle qui n'est pas implémentée ?

    j'essaye sur des tests et on dirait que c'est ce genre de trucs.
    peut etre un destructeur virtuel non implémenté ?

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

Discussions similaires

  1. [POO] Quand utiliser une classe ?
    Par Gwipi dans le forum Langage
    Réponses: 8
    Dernier message: 05/05/2006, 14h31
  2. Réponses: 5
    Dernier message: 03/04/2006, 09h57
  3. attribut partagé d'une classe
    Par tanjonaravelson dans le forum Général Python
    Réponses: 3
    Dernier message: 27/09/2005, 16h26
  4. [Applet]utiliser une classe d'un package dans une applet
    Par jeromejanson dans le forum Applets
    Réponses: 1
    Dernier message: 30/06/2005, 08h13
  5. [EJB][JONAS] EJB utilisant une classe "externe"
    Par Gregory3000 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/12/2004, 19h57

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