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 :

[Compilation] probleme de linking avec une classe


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut [Compilation] probleme de linking avec une classe
    Bonjour,
    J’ai crée un fichier qui utilise plusieurs classes.


    Dans l’header “mathplot.h” je déclare la classe mpWindow comme ceci :
    wxScrollWindow est une classe issue de wxWidgets.

    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
    Class WXDLLEXPORT mpWindow;
     
    class WXDLLEXPORT mpWindow : public wxScrolledWindow
     {
     public:
         mpWindow() {}
         mpWindow( wxWindow *parent, wxWindowID id,
                          const wxPoint &pos = wxDefaultPosition, 
                          const wxSize &size = wxDefaultSize,
                          int flags = 0);
         ~mpWindow();
     
         wxMenu* GetPopupMenu() { return &m_popmenu; }
     
    ….};
    Dans un autre fichier .cpp, j’utilise le constructeur mpWindow à la ligne 29.
    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
    0)#include «mathplot.h»
    …..
     MyFrame::MyFrame()
            : wxFrame( (wxFrame *)NULL, -1, wxT("wxWindows mathplot sample –  Comparison of Integer Coding Algorithms"))
     {
       wxMenu *file_menu = new wxMenu();
       wxMenu *view_menu = new wxMenu();
       file_menu->Append( ID_ABOUT, wxT("&About.."));
       file_menu->Append( ID_QUIT,  wxT("E&xit\tAlt-X"));
     
       view_menu->Append( mpID_FIT,wxT("&Fit bounding box"), wxT("Set plot view to show all items"));
       view_menu->Append( mpID_ZOOM_IN,  wxT("Zoom in"), wxT("Zoom 14 in plot view."));
       view_menu->Append( mpID_ZOOM_OUT, wxT("Zoom out"), wxT("Zoom 16 out plot view."));
     
       wxMenuBar *menu_bar = new wxMenuBar();
       menu_bar->Append(file_menu, wxT("&File"));
       menu_bar->Append(view_menu, wxT("&View"));
       SetMenuBar( menu_bar );
       mpLayer *e, *f, *h, *bs;
       wxPoint Lepoint=wxPoint(0,0);
       wxSize  Lataille=wxSize(100,100);
       m_plot = new mpWindow( this, -1,Lepoint ,Lataille, wxSUNKEN_BORDER )
    ;
    }

    Quand je compile, il n’y a aucun probleme de code. Par contre, il y a une erreur de link :
    hhh.obj : error LNK2019: symbole externe non résolu "public: __thiscall mpWindow::mpWindow(class wxWindow *,int,class wxPoint const &,class wxSize const &,int)" (??0mpWindow@@QAE@PAVwxWindow@@HABVwxPoint@@ABVwxSize@@H@Z) référencé dans la fonction "public: __thiscall MyFrame::MyFrame(void)" (??0MyFrame@@QAE@XZ)
    1>C:\Users\Pierre\Favorites\Documents\Visual Studio 2008\Projects\Graphs\Debug\Graphs.exe : fatal error LNK1120: 1 externes non résolus

    Pourtant, la fonction mpWindow est bien déclarée dans le fichier header et ce header est bien déclaré dans le fichier cpp.
    Est-ce parce que j’appelle mal ma fonction ?
    Je vois pas du tout ou est le pb.
    Merci

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    C'est comme les bonnes charcutries, c'est marqué dessus

    Le problème est que tu déclare une fonction pour laquelle tu ne fournis aucune implémentation (définition)

    Cette fonction est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         mpWindow( wxWindow *parent, wxWindowID id,
                          const wxPoint &pos = wxDefaultPosition, 
                          const wxSize &size = wxDefaultSize,
                          int flags = 0);
    Comme cette fonction est appelée explicitement depuis la fonction MyFrame::MyFrame, ben tu te trouve dans la situation suivante:

    Le compilateur connait la fonction, mais, lorsqu'il s'agit d'editer les liens, l'éditeur de liens ne retrouve pas l'implémentation

    Une fois que tu auras effectivement défini la fonction, tout rentrera dans l'ordre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Points : 97
    Points
    97
    Par défaut
    Bonjour tout le monde,


    Je me retrouve confronté au même problème que Deubelte, qui a en mon sens pas été résolu. J'ai téléchargé la bibliothèque wxMathplot qui va avec wxWidgets. J'utilise ça sous code::block.

    Donc j'ai un wxMathplot.h et un wxMathplot.cpp.

    Comme chez Deubelte, dans mon .h il y a la déclaration du constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     mpWindow(wxWindow *parent, wxWindowID id,
                         const wxPoint &pos = wxDefaultPosition,
                         const wxSize &size = wxDefaultSize,
                         long flags = 0);
    Et dans le .cpp si je cherche bien je trouve les lignes de définition de ce constructeur :


    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
    mpWindow::mpWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long flag )
        : wxWindow( parent, id, pos, size, flag, wxT("mathplot") )
    {
        m_scaleX = m_scaleY = 1.0;
        m_posX   = m_posY   = 0;
        m_desiredXmin=m_desiredYmin=0;
        m_desiredXmax=m_desiredYmax=1;
        m_scrX   = m_scrY   = 64; // Fixed from m_scrX = m_scrX = 64;
        m_minX   = m_minY   = 0;
        m_maxX   = m_maxY   = 0;
        m_last_lx= m_last_ly= 0;
        m_buff_bmp = NULL;
        m_enableDoubleBuffer        = FALSE;
        m_enableMouseNavigation     = TRUE;
        m_mouseMovedAfterRightClick = FALSE;
        m_movingInfoLayer = NULL;
        // Set margins to 0
        m_marginTop = 0; m_marginRight = 0; m_marginBottom = 0; m_marginLeft = 0;
     
     
        m_lockaspect = FALSE;
     
        m_popmenu.Append( mpID_CENTER,     _("Center"),      _("Center plot view to this position"));
        m_popmenu.Append( mpID_FIT,        _("Fit"),         _("Set plot view to show all items"));
        m_popmenu.Append( mpID_ZOOM_IN,    _("Zoom in"),     _("Zoom in plot view."));
        m_popmenu.Append( mpID_ZOOM_OUT,   _("Zoom out"),    _("Zoom out plot view."));
        m_popmenu.AppendCheckItem( mpID_LOCKASPECT, _("Lock aspect"), _("Lock horizontal and vertical zoom aspect."));
        m_popmenu.Append( mpID_HELP_MOUSE,   _("Show mouse commands..."),    _("Show help about the mouse commands."));
     
        m_layers.clear();
        SetBackgroundColour( *wxWHITE );
    	 m_bgColour = *wxWHITE;
    	 m_fgColour = *wxBLACK;
     
        m_enableScrollBars = false;
        SetSizeHints(128, 128);
     
        // J.L.Blanco: Eliminates the "flick" with the double buffer.
        SetBackgroundStyle( wxBG_STYLE_CUSTOM );
     
        UpdateAll();
    }

    Lorsque je crée mon projet sous codeblock et que je rajoute un element mpWindow les lignes suivantes de code sont ajoutées dans mon projet.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MathPlot1 = new mpWindow(Panel1, ID_MATHPLOT1, wxDefaultPosition, wxSize(258,128), wxRAISED_BORDER|wxTAB_TRAVERSAL);
        MathPlot1->UpdateAll();
        MathPlot1->Fit();
    dans mon projet.h apparait la ligne :



    lorsque j'essaye de compiler j'obtiens les mêmes erreurs que Deubelte à savoir :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ||=== Build: Release in sdfgfhdgd (compiler: GNU GCC Compiler) ===|
    obj\Release\sdfgfhdgdMain.o:sdfgfhdgdMain.cpp|| undefined reference to `mpWindow::mpWindow(wxWindow*, int, wxPoint const&, wxSize const&, long)'|
    obj\Release\sdfgfhdgdMain.o:sdfgfhdgdMain.cpp|| undefined reference to `mpWindow::UpdateAll()'|
    ||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 8 second(s)) ===|
    J'ai deux questions.

    • L'une est assez immédiate : Pourquoi ai je la même erreur alors que dans nos deux cas, on fait bien appel au mathplot.h et que dans mathplot.cpp la fonction est bien définie.
    • La seconde question est d'ordre plus générale et d'ordre plus pratique : quand je fais une erreur de code, l'IDE indique la ligne et l'endroit dans le code où se trouve l'erreur et quand il s'agit d'erreur avec des constructeurs généralement, il indique que le constructeur fait appel à tel ou tel type de donnée alors qu'il devrait faire appel à tel ou tel type de donnée (du genre ça ne marche pas parceque tu utilises des int int alors que tu dois utiliser un double et un int)


    Merci pour votre aide,

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Erreur récurrente avec Code::Block, le fait d'ajouter un cpp au projet ne garantie pas que celui-ci sera compilé et que le fichier généré sera transmit au linker.
    Vérifier que le cpp est dans la cible de compilation du projet.
    Reportez-vous à la documentation de Code::Block, ou à Google, car c'est la cause principale des erreurs de link avec Code::Block.

  5. #5
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Points : 97
    Points
    97
    Par défaut
    Merci pour ta réponse,


    Je ne l'ai pas spécifié mais j'ai bien rajouté le dossier contenant wxMathplot.h et wxMathplot.cpp dans les "buids options" du projet (onglet search directorie -> Compiler + linker + Ressource compiler)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Je ne connais pas Code::Block mais votre éditeur de lien est on ne peut plus explicite, il ne vois pas de code pour votre constructeur ni pour la méthode "UpdateAll" mais vois votre méthode "Fit", qui doit être inline.
    Inlinez le constructeur et UpdateAll et vous verrez que cela compilera, c'est que le compilateur ne compile pas votre .cpp.

  7. #7
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Points : 97
    Points
    97
    Par défaut
    Messieurs,

    Merci,

    Je m'étais trompé. Je rajoutais le dossier contenant le .h et le .cpp comme s'il s'agissait d'une bibliothèque c'est à dire que
    j'avais rajouté le dossier contenant wxMathplot.h et wxMathplot.cpp dans les "buids options" du projet
    Si des gens tombent sur ce post et qu'il rencontrent le même problème que moi : il faut plutôt aller dans project-> add files et sélectionner le .cpp et .h

    Pour moi le problème semble être résolu.

    Bonne soirée,

Discussions similaires

  1. [2.x] probleme de syntaxe avec une classe
    Par adel25 dans le forum Symfony
    Réponses: 1
    Dernier message: 01/09/2013, 22h39
  2. Probleme de débutant avec une class
    Par hugoclo dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 06/06/2013, 16h14
  3. problem de vector avec une classe
    Par potterthekiller dans le forum SL & STL
    Réponses: 7
    Dernier message: 19/03/2007, 11h11
  4. [débutant] probleme avec une classe arbre
    Par go_all_in dans le forum C++
    Réponses: 17
    Dernier message: 08/06/2006, 10h33
  5. Probleme avec une class template
    Par lenectar dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2006, 10h49

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