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

Autres éditeurs Discussion :

g++ : undefined reference to ...


Sujet :

Autres éditeurs

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut [Résolu] g++ : undefined reference to ...
    voila, j'ai implémenté le design pattern "Observable" en C++ sous linux (gcc ou g++).

    le code se compile bien mais j'ai voulu faire un test, j'ai donc écrit un fichier tel que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "observable.h"
     
    int main()
    {
    	Observable *o = new Observable();
    }
    et là, il me retourne:

    /home/le_barbu/tmp/cchfCH2Q.o(.text+0x2b): In function `main':
    : undefined reference to `Observable::Observable[in-charge]()'
    collect2: ld returned 1 exit status

    Il plante donc au niveau de l'édition des liens!

    pourtant j'ai compilé avec:

    g++ -I. main.cpp (j'ai bien "inclus" le répertoire où se trouvent les sources...)

    quoi que c'est que cette erreur ?

    merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu n'aurais pas oublié de définir le constructeur ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Re:
    ben non, voici mon code:
    (je sais qu'il n'est pas parfait mais je me remets au c++ donc je fais comme je peux pour l'instant :-) )
    observable.h
    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
     
    #ifndef OBSERVABLE_H
    #define OBSERVABLE_H
     
    #include <vector>
     
    using namespace std;
     
    class Observer;
     
    class Observable
    {
    private:
    	vector<Observer *> *observers;
    	bool stateChanged;
     
    public:
    	Observable();
     
    	virtual ~Observable();
     
    	void addObserver(Observer *o);
    	void removeObserver(Observer *o);
     
    	void notify(void);
    	void notify(Observer *o);
     
    	void changed(void);
    };
     
    class Observer
    {
    public:
    	virtual void update(Observable *o);
    };
     
    #endif
    et observable.cpp:
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    #include "observable.h"
     
    Observable::Observable()
    {
    	observers = new vector<Observer *>;
    	stateChanged=false;
    }
     
    Observable::~Observable()
    {
    	delete observers;
    }
     
    void Observable::changed()
    {
    	stateChanged = !stateChanged;
    }
     
    void Observable::addObserver(Observer *o)
    {
    	for (int i=0; i<observers->size(); i++)
    	{
    		if ( observers->at(i) == o)
    		{
    			return;
    		}
    	}
    	observers->push_back(o);
    }
     
    void Observable::removeObserver(Observer *o)
    {
    	vector<Observer *>::iterator it = observers->begin();
     
    	while ( it != observers->end() )
    	{
    		if ( *it == o)
    		{
    			observers->erase(it);
    			return;
    		}
    		++it;
    	}
    }
     
    void Observable::notify(void)
    {
    	if (! stateChanged)
    	{
    		return;
    	}
     
    	for (int i=0; i<observers->size(); i++)
    	{
    		observers->at(i)->update(this);
    	}
    }
     
    void Observable::notify(Observer *o)
    {
    	if (! stateChanged)
    	{
    		return;
    	}
     
    	Observer *found;
    	for (int i=0; i<observers->size(); i++)
    	{
    		found = observers->at(i);
    		if (found == o)
    		{
    			found->update(this);
    			return;
    		}
    	}
    }

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    L'autre hyppothèse est un problème d'ordre lors de l'édition des liens.
    Sujet discuté ici: news://d6652001.0405032323.38d11f19@posting.google.com Regarde dans tout le fil d'où est tiré ce message-id.

    Autrement. Les vecteurs ne sont pas fait pour être manipulés via des pointeurs. Il s'agit déjà d'une abstraction qui encapsule pour nous les problèmes de gestion de mémoire. Pas besoin de les réintroduire.

    Sinon, dans le passé, j'avais posté une version assez personnelle de ce pattern (pour une toute autre question). http://www.developpez.net/forums/vie...=992700#992700
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Re:
    ok, merci bien je vais voir si je peux trouver de quoi répondre à ma question.

    pour les pointeurs, je sais je vais trouver une solution plus adéquate.

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Pas besoin de chercher loin pour le vecteur. N'en fait pas un pointeur c'est tout. Un vecteur de pointeurs, OK ; un pointeur de vecteur, non.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Re:
    decidement, j'ai un probleme!

    c'est koi la différence entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Observable *o = new Observable(); // plante à la compilation
    Observable *o(); // ca compile!

  8. #8
    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
    La différence est que la seconde ligne n'a pas besoin de connaitre la définition de la classe Observable, une déclaration anticipée suffit pour pouvoir la compiler. La 1ere ligne, au contraire, aura certainement besoin d'un #include "Observable.h".

    PS : ta deuxieme ligne sera meme surement interprétée comme une declaration de fonction.

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Re:
    d'accord, mais comment je fais moi? lol

    j'ai meme fait un test simple. voila:

    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
     
    //test.h
     
    class Test
    {
    	public:
    		Test();
    };
     
    //test.cpp
     
    #include <iostream.h>
    #include "test.h"
     
    Test::Test()
    {
    	cerr << "Test()" << endl;
    }
     
    //main.cpp
     
    int main()
    {
    	Test *t = new Test();
    	return 0;
    }
    j'obtiens ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    In function `main':
    : undefined reference to `Test::Test[in-charge]()'
    collect2: ld returned 1 exit status
    c koi le probleme ?!

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Comment tu linkes ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut précision...
    j'ai oublié, je compile test.cpp avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    g++ -Wno-deprecated -c test.cpp
     
    //et main.cpp avec ceci:
     
    g++ main.cpp
    j'oublie quelque chose ?

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    oui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g++ -Wall -pedantic -c test.cpp
    g++ -Wall -pedantic -c main.cpp
    g++ -Wall -pedantic main.o test.o -o main.exe
    Et si tu ne veux pas être insulté au sujet d'anciens entêtes qui sont dépréciés, utilise <iostream> et n'oublie pas "std".
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  13. #13
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut suite
    donc je fais un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    g++ -Wall -pedantic main.cpp
     
     et j'obtiens toujours (sur l'utilisation de ma classe Test dans main.cpp):
     
    main.cpp: In function `int main()':
    main.cpp:5: warning: unused variable 't'
    /home/le_barbu/tmp/ccAJAKNF.o(.text+0x37): In function `main':
    : undefined reference to `Test::Test()'
    collect2: ld returned 1 exit status
    j'ai aussi changé le <iostream.h> en <iostream> & utilisé "using namespace std;"
    donc je n'ai plus de warning sur le fichier d'include iostream.h...

    Mais toujours incapable de compiler le main !!!

    au secours!

  14. #14
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu as mal recopié ce que j'ai écrit...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  15. #15
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut suite & fin [RESOLU]
    merci bien!

    ok, j'ai refait:

    gcc -Wall -pedantic test.o main.o -o main

    mais pourkoi faut-il lui donner tous les fichiers objet pour compiler ?

    je débute en "compilation" alors ne m'en veuillez pas!

    enfin, ce que je veux dire c'est pourkoi il ne les trouve pas tout seul vu qu'ils se trouvent dans le meme répertoire ?

    en tout cas, MERCI BEAUCOUP :-)

  16. #16
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Il ne peut pas savoir quels fichiers il faut lier ensemble. Dans un répertoire, j'ai une 100aine de fichiers de tests, heureusement qu'il ne cherche pas à tous les mélanger ensembles.

    Et gcc sans l'option qui va bien compile du C, c'est g++ qu'il te faudra utiliser pour lier.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  17. #17
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut merci
    merci beaucoup!

    pour l'histoire du linkage, c vrai heureusement qu'il ne cherche pas tout seul à tout lier...

    des fois je me demande ou j'ai la tete lol

    sinon, j'ai peut-etre mis gcc (je ne sais plus) comme commande dans mes postes mais j'utilise bien g++.

    encore merci !

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

Discussions similaires

  1. winsock.h : undefined reference...
    Par abraxas dans le forum Dev-C++
    Réponses: 14
    Dernier message: 06/08/2012, 13h42
  2. [debutant] compilation g++ : undefined reference
    Par xavlours dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 10/03/2005, 15h49
  3. Undefined reference compilation réseau
    Par Ren97 dans le forum Dev-C++
    Réponses: 11
    Dernier message: 08/03/2005, 09h46
  4. Compilation de xmms : undefined reference to...
    Par Michaël dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 04/02/2005, 19h05
  5. undefined reference to `xmlParseFile'
    Par Clemaster dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 25/06/2004, 20h38

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