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 :

[Linker error] DLL -> undefined reference to `vtable ?


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut [Linker error] DLL -> undefined reference to `vtable ?
    Bonjour,
    J'ai toujours un problème avec ma dll : Je veut redéfinir des opérateurs et les surcharger.
    Avec devc++, j'ai donc mit :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    //Point.h
    DLLIMPORT class Point2d : public Point
    {
        public:
          //...
          DLLIMPORT virtual bool operator== (Point & Obj);
          DLLIMPORT virtual bool operator== (Point2d & Obj);
          DLLIMPORT virtual bool operator== (Point3d & Obj);
          DLLIMPORT virtual Point2d & operator++ ();
          DLLIMPORT virtual Point2d & operator++ (int);
          //...
    }
    //Point.cpp [Exporter]
    bool Abl::Point::operator== (Point & Obj)
    {
      return x == Obj.x;
    }
    bool Abl::Point::operator== (Point2d & Obj)
    {
      return x == Obj.x;
    }
    bool Abl::Point::operator== (Point3d & Obj)
    {
      return x == Obj.x;
    }
    //...
    mais si je vuet utiliser par exemple :
    P1 == P2;
    J'obtien le méssage d'éreur [Linker error] undefined reference to `vtable for Abl:oint'
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    petite remarque qui n'a peut-etre rien à voir (mais on sait jamais...)
    d'habitude, quand on redéfinie l'opérateur == (ou <, <=, etc...) ces méthodes sont déclarées const, et elle reçoivent en argument des références sur des constantes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DLLIMPORT class Point2d : public Point 
    { 
        public: 
          //... 
          DLLIMPORT virtual bool operator== (const Point & Obj) const; 
          //... 
    } 
    inline bool Abl::Point::operator== (const Point & Obj) const
    { 
      return x == Obj.x; 
    }
    si on ne fait pas ça, on a des erreurs de linkage quand on compare des objets constants.

  3. #3
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    D'acord, mais le problème persiste, que ce soit avec == ou ++ et --
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 94
    Points : 82
    Points
    82
    Par défaut
    Allez, encore une petite objection (rien que pour faire ch*** le monde ). En général, on ne surcharge pas ++ avec un argument. Comment tu veux écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i;
    i ++ 2 // ??!!?!!?...!!
    Sinon, je ne suis pas un pro de la DLL, désolé

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En général, on ne surcharge pas ++ avec un argument
    C'est pour différencier l'opérateur ++ de post-incrémentation et l'opérateur ++ de pré-incrémentation. Le paramètre int ne sera jamais utilisé, mais c'est comme ça qu'il faut faire et pas autrement.

    Sinon, est-ce que Point est également exporté ?

    PS : comme je l'ai dit dans un autre post, je suis sceptique quant à ce design de classes de points, mais difficile d'en dire plus sans savoir ce que tu fais avec.

  6. #6
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Ces point servent a..... Stocker des coordonées
    Ils sont pour les espaces 1D, 2D, 3D(droite, repère, espace)
    Sinon j'exporte la totalitée du code, donc oui Point est exporter, Point 2D et Point3D aussi.

    Je voudrais savoir ce que signifi ce message d'éreur car je ne voit pas du tout où chercher.
    Pour l'exportation je sais jamais quand je doit mêtre DLLIMPORTE, donc sa peut peutêtre venir de sa.
    Je le met dans la définition des prototypes(devan les classes et devan les fonction et enffin devan les variables).

    Je tien a surharger == pour comparer les valeures des points, et ++ / -- pour décaler le point sur la droite/repère/espace.

    Enffaite je développe cette dll pour mes programmes a venir, comme cela si j'ai besoin de classe pour gèrer des points, ou effectuer des opérations du genre calcule de distance dans un repère orthonormer ou encore vecteur, equations de droite.... J'aurais des classes et des fonctions toute prête qui me permêtrons de gagner du temp. Et bien sur en les écrivants je gagne de l'expérience.(Comme dans les MMORPG, plus un tape plus on gagne d'xp.)
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  7. #7
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut Re: [Linker error] DLL -> undefined reference to `vtable
    Citation Envoyé par JC_Master
    Je voudrais savoir ce que signifie ce message d'erreur car je ne voit pas du tout où chercher.
    [Linker error] undefined reference to `vtable for Abl:oint' signifie qu'il ne trouve pas une méthode virtuelle (vtable = virtual table) au moment du link. Vu le message, il semblerait que ce soit le constructeur de ta classe.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Un constructeur ne peut pas être virtuel.
    Supprime le DLLIMPORT devant tes opérateurs dans la mesure où ils sont inline.

  9. #9
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Mon constructeur n'est pas virtuèle?!
    Sinon j'ai suprimmer tout les inlines.

    Le message d'éreur n'aparait qu'avec ++/--/==, mais si je n'utilise pas ces opérateur, je n'ai pas d'éreur. Je peut créer des objets point, point3d et point2d.

    Donc il faudrais chercher du cotée d'un problème d'exportation? Esqu'il faut rajouter DLLIMPORT dans le .h dans la classe?

    (Je présise que ma DLL compile, mais que l'horsque je l'utilise il est impossible de compiller avec Point ==/ Point++ / Point-- !
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  10. #10
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Un constructeur ne peut pas être virtuel.
    Heu, oui, tout à fait... Honte à moi.

  11. #11
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Je tien a présize la structure un peut bizare de mes définitions :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    //Abl.h
    #ifndef _DLL_H_
    #define _DLL_H_
    #if BUILDING_DLL
    # define DLLIMPORT __declspec (dllexport)
    #else /* Not BUILDING_DLL */
    # define DLLIMPORT __declspec (dllimport)
    #endif /* Not BUILDING_DLL */
    //Namespace of this
    class DLLIMPORT Abl
    {
      public:
        DLLIMPORT Abl();
        DLLIMPORT virtual ~Abl();
     
        #include "Point.h"
     
      protected:
     
      private:
     
    };
    #endif /* _DLL_H_ */
    //Point.h
    #ifndef Point_
    #define Point_
     
    /*******************************
    *            Point             *
    *------------------------------*
    *    Points dans l'espace      *
    ********************************/
     
    class Point;
    class Point2d;
    class Point3d;
     
    class Point
    {   
        public:
          DLLIMPORT Point();
          DLLIMPORT virtual ~Point();
          DLLIMPORT virtual Point & set( double _x = 0 );
          DLLIMPORT virtual Point & set( Point3d & Obj );
          //..
    };
    DLLIMPORT class Point2d : public Point
    {
        public:
          DLLIMPORT Point2d();
          DLLIMPORT virtual ~Point2d();
          DLLIMPORT virtual Point2d & set( double _x = 0, double _y = 0 );
    };
    DLLIMPORT class Point3d : public Point2d
    {
        public:
          DLLIMPORT Point3d();
          DLLIMPORT virtual ~Point3d();
          DLLIMPORT virtual Point3d & set( double _x = 0, double _y = 0, double _z = 0 );
    };
    #endif
    (J'ai simplifier)

    J'obtien la même éreur qu'avec les opérateures pour L'utilisation de P1.set(P3), mais pas pour P1.set(75) ou P2.set(0) ou P3.set(32) !

    Edit : En renoman la fonction set( Point3d & Obj ) en tst( Point3d & Obj) je n'ai plus le message d'éreur?!!!
    Il y aurais un problème de surchage de fonction avec dev c++ ?
    Edit : Il semblerais que le " --no-export-all-symbols " du linker bloquais la surcharge. Sa résou le problème de la surcharge de fonction, mais pas celles des opérateures O_O
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class DLLIMPORT Abl 
    { 
      public: 
        DLLIMPORT Abl(); 
        DLLIMPORT virtual ~Abl(); 
     
        #include "Point.h"
    bizarre...
    Tu implémentes où tes fonctions virtuelles ? Donne un exemple, pour Point::set par exemple, ou devrais-je dire Abl:oint::set. Il me semble qu'on ne peut pas exporter des inner-class.

  13. #13
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Je ne sait pas ce qu'est une iner class, mais Abl:oint3d fonction exepter pour les opérateur(et les surcharge ne fonctione que si je supprime la ligne " --no-export-all-symbols ")
    Par contre les opérateures ne marchent dans aucune des classes.

    Sinon plutot que de mêtre des morceaus de code un peut n'importe ou et qu'on s'y pèrde, voici les sources :
    http://t4cwebserver.free.fr/Abl/
    Comme cela vous pourez même les compiler pour contater le problèmme.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  14. #14
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Une inner-class, c'est une classe interne à une autre classe. Dans ton cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class DLLIMPORT Abl 
    { 
        // blablabla
     
        #include "Point.h" 
    };
    devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class DLLIMPORT Abl 
    { 
        // blablabla
     
        class Point { ... };
        DLLIMPORT class Point2d : public Point { ... };
        DLLIMPORT class Point3d : public Point2d { ... };
    ouha, j'avais jamais pensé à l'héritage entre inner-class
    Je ne sais pas ce qu'il en est de devcpp, mais pour VC++, on ne peut pas exporter une inner-class.
    Et à la vue de ton code, on se demande pourquoi Abl n'est pas un namespace :
    Autre chose : DLLIMPORT doit être placé entre le mot-clé class et le nom de la classe. Ensuite c'est pas la peine pour les fonctions membres.
    Autre chose encore (pout VC++ du moins) : si tu exportes une classe, il faut aussi exporter ses classes de base / les classe qu'elle utilise dans le .h. Ainsi, tu devrais exporter Point.
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    //Point.h 
    #ifndef Point_ 
    #define Point_ 
     
    /******************************* 
    *            Point             * 
    *------------------------------* 
    *    Points dans l'espace      * 
    ********************************/ 
     
    namespace Abl
    {
    class DLLIMPORT Point 
    {    
        public: 
          Point(); 
          virtual ~Point(); 
          virtual Point & set( double _x = 0 ); 
          virtual Point & set( Point3d & Obj ); 
          //.. 
    }; 
    class DLLIMPORT Point2d : public Point 
    { 
        public: 
          Point2d(); 
          virtual ~Point2d(); 
          virtual Point2d & set( double _x = 0, double _y = 0 ); 
    }; 
    class DLLIMPORT Point3d : public Point2d 
    { 
        public: 
          Point3d(); 
          virtual ~Point3d(); 
          virtual Point3d & set( double _x = 0, double _y = 0, double _z = 0 ); 
    }; 
    }
    #endif

  15. #15
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Ok, sinon je suis obliger de faire un :
    class Point;
    class Point2d;
    class Point3d;

    avent de déclarer mes clases car des fonctions de Point utilise des objets Point2d et des fonctions Point2d utilisent des objets Point3d....

    Sinon les iner-class fonctione(je ne savais pas que sa ne fonctionais pas sous visual c++, sous dev sa marche impec)

    Et enfin pour la dernière question, la réponsse c'est que je ne sais pas exporter un namespace...

    Enfin bref. Je voi si sa fonctione en mêtent le class dllimport nom

    Edit : C'est un miracle, sa fonctione!!! Je me demende ce qui se passe si je remet la ligne " --no-export-all-symbols "... Rien la surcharge marche impec!
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et enfin pour la dernière question, la réponsse c'est que je ne sais pas exporter un namespace...
    Un namespace n'a aucune signification "physique", c'est juste un mécanisme syntaxique (pour éviter les conflits de noms). Donc ça ne s'exporte pas.
    Par contre tu peux exporter les classes / fonctions que tu y mets.

  17. #17
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Ah! Ok merci de l'info, je vais quand même garder mon désign bizard(Apprès tout, les tableau de picasso était bizard... ^^)
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  18. #18
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    En fait ton namespace va être plus ou moins exporté via ce qu'il contient : tes classes seront exportées en tant que membre d'un namespace. C'est automatique (name mangling).

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

Discussions similaires

  1. [Error] undefined reference to `vtable for ?
    Par Some0ne dans le forum C++
    Réponses: 1
    Dernier message: 20/01/2011, 00h34
  2. Réponses: 1
    Dernier message: 19/07/2009, 22h37
  3. undefined reference to `vtable for Graphique'
    Par lilly91 dans le forum Débuter
    Réponses: 11
    Dernier message: 23/06/2009, 17h41
  4. undefined reference to `vtable for
    Par zalalus dans le forum Qt
    Réponses: 13
    Dernier message: 27/05/2009, 15h27
  5. undefined reference to vtable
    Par sleigh dans le forum C++
    Réponses: 3
    Dernier message: 22/05/2007, 09h48

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