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++

  1. #1
    Membre émérite
    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 : 36
    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
    Points : 2 466
    Points
    2 466
    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.
    -- Yankel Scialom

  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 émérite
    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 : 36
    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
    Points : 2 466
    Points
    2 466
    Par défaut
    Ma fonction est bien présente (sans décoration), mais mes classes le sont aussi sous formes décorées.
    -- Yankel Scialom

  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 émérite
    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 : 36
    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
    Points : 2 466
    Points
    2 466
    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.
    -- Yankel Scialom

  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é ?

  7. #7
    Membre émérite
    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 : 36
    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
    Points : 2 466
    Points
    2 466
    Par défaut
    Exact,
    MNT_Parser est une classe abstraite. Elle a une fonction virtuelle (get_altitude) correctement surchargée par DTED_Parser et SRTM_Parser (deux classes filles). Et je vois d'où vient mon erreur mais pas comment la corriger : je définie des objets de types DTED_Parser et SRTM_Parser mais n'enregistre que leur pointer recasté en MNT_Parser*. Puis j'appelle ->get_altitude.

    Cela fonctionne très bien sans shared library :/
    -- Yankel Scialom

  8. #8
    screetch
    Invité(e)
    Par défaut
    _ZTI pourrait etre Type Info
    si je compile avec -fno-rtti cette info disparait (ni en *UND* ni nulle part)
    cette info est ajoutée avec la table de methode virtuelle ou de l'héritage virtuel je crois

  9. #9
    screetch
    Invité(e)
    Par défaut
    MNT_Parser est une classe abstraite définie dans libmnt c'est ca ?
    et DTED_Parser et tout ca, sont ils définis aussi dans libmnt ? ou dans ton executable ?

  10. #10
    Membre émérite
    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 : 36
    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
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par screetch Voir le message
    _ZTI pourrait etre Type Info
    si je compile avec -fno-rtti cette info disparait (ni en *UND* ni nulle part)
    cette info est ajoutée avec la table de methode virtuelle ou de l'héritage virtuel je crois
    Si je précise l'option -fno-rtti je me retrouve avec un autre symbole non résolu : _ZTV10MNT_Parser

    Citation Envoyé par screetch Voir le message
    MNT_Parser est une classe abstraite définie dans libmnt c'est ca ?
    et DTED_Parser et tout ca, sont ils définis aussi dans libmnt ? ou dans ton executable ?
    Oui, toutes les classes sont définies dans libmnt.
    -- Yankel Scialom

  11. #11
    screetch
    Invité(e)
    Par défaut
    c'est vraiment bizarre tout ca
    VT c'est la table virtuelle, donc c'est bien qu'il "manque" la table virtuelle de cette classe

    je fais deux trois tests avec des classes bidon et je reviens...

  12. #12
    screetch
    Invité(e)
    Par défaut
    j'obtiens cette erreur avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class MaClasse
    {
    public:
      MaClasse();
      virtual ~MaClasse();
     
      virtual void test() = 0;
    };
     
    MaClasse::MaClasse()
    {
    }
     
    //MaClasse::~MaClasse()
    //{
    //}
    donc mon diagnostic reste le même qu'en post numéros 2 et 4 : tu as une fonction virtuelle dans ta classe (qui n'est pas virtuelle pure) et tu as oublié de l'implémenter ou de la mettre pure

    regarde toute tes fonctions virtuelles; je suis sur que l'une manque un =0 ou une définition =)

  13. #13
    Membre émérite
    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 : 36
    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
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par screetch Voir le message
    regarde toute tes fonctions virtuelles; je suis sur que l'une manque un =0 ou une définition =)
    Tout à fait. Un =0 était commanté :/
    Compilation, link, runtime link OK.

    Merci beaucoup de ton aide.

    Dernière chose, pourrais-tu m'expliquer la différence entre virtuelle simple et virtuelle pure ?
    -- Yankel Scialom

  14. #14
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Dernière chose, pourrais-tu m'expliquer la différence entre virtuelle simple et virtuelle pure ?
    http://cpp.developpez.com/faq/cpp/?p...ction_vituelle
    Décidemment, on trouve vraiment tout dans cette FAQ
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  15. #15
    Membre émérite
    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 : 36
    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
    Points : 2 466
    Points
    2 466
    Par défaut
    Merci.
    -- Yankel Scialom

+ 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