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

Dev-C++ Discussion :

Erreur de linker, comment faire ?


Sujet :

Dev-C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut Erreur de linker, comment faire ?
    Bonjour,

    je me lance dans mon premier prog sous Dev-C++ et je suis bloqué à cause d'une erreur de linker.
    J'ai créé un header "serveur.h" qui contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class serveur{
    	private: 
    		int           port;
    		SOCKET	      ListeningSocket;
    		bool          running;  
    		SOCKADDR_IN   ServerAddr; 
    		DWORD         ClientThread(SOCKET);     
    	public:                                        
    		serveur(int);
    		int           init();
    		int           start ();  
    		int           pause ();
    }
    et je veux accéder à
    serveur::serveur(p)
    mais la j'ai l'erreur
    [Linker error] undefined reference to `serveur::serveur(int)'
    En faite on fait comment pour linker ce ".h" ???? Je n'ai jamais fais cela et je n'ai pas trouvé de réponse sur les messages du forum, qqun sait la démarche à suivre??

    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Où est défini le constructeur serveur(int) ?
    Tu n'as posté que sa déclaration...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    Exacte un oubli de ma part, j'ai voulu s'implifier l'affichage en ne mettant que le nécessaire et j'oublie le constructeur...

    Le constructeur est placé dans la class Serveur juste en dessous de ma fonction pause() et avant la dernière accolade.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu veux dire qu'il est inline ?
    Puis-je voir le vrai code?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    Voila se qu'il y a dans le fichier "serveur.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
    #ifndef _serveur_h_
    #define _serveur_h_
     
     
    #include <iostream>
    #include <winsock2.h>
     
    class serveur{
    	private: 
    		int           port;
    		SOCKET	      ListeningSocket;
    		bool          running;  
    		SOCKADDR_IN   ServerAddr; 
    		DWORD         ClientThread(SOCKET);     
    	public:                                        
    		serveur(int);
    		int           init();
    		int           start ();  
    		int           pause ();
    		static DWORD WINAPI ThreadLauncher(void *p)
            {
    		/*	struct thread_param *Obj = reinterpret_cast<struct thread_param*>(p);               
            	serveur *s = Obj->ser;                          
             	return s->ClientThread(Obj->soc);       */
     
    		}
     
    	serveur::serveur(int p){
    	port            = p;
    	running         = false;
        }
     
    };
     
    #endif
    Mais je crois savoir pourquoi ça ne marche pas. Sous mon main j'utilisait la classe sans avoir créé un objet. Mais comment on fait pour créer un objet afin qu'il accède à la classe?

  6. #6
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    En faite dans mon main() pour utiliser la class je fais comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main ()
    {
     
        serveur *serv;
     
        serv = new serveur ;
     
        serv.serveur(p);
     
       return ;
    }
    Mais j'obtiens cette erreur
    100 C:\Dev-Cpp\serveur.cpp no matching function for call to `serveur::serveur()'
    J'ai bien déclaré mon objet dans le main ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu n'appelles pas le constructeur correctement.
    Je vois deux façons de le faire:

    Instanciation de l'objet sur la pile:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main (void)
    {
    	int p = 1234;
    	serveur serv(p);
     
    	// serv est créé sur la pile et opérationnel
    	serv.start();
     
    	return 0;
    }

    Instanciation sur le tas:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main (void)
    {
    	int p = 1234;
    	serveur * pServ;
     
    	pServ = new serveur(p);
    	// un objet serveur est créé sur le tas et opérationnel
    	// pServ pointe maintenant dessus
    	pServ->start();
     
    	delete pServ, pServ=NULL;
    	return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    Que j'utilise l'une ou l'autre solution le compilateur me dit
    serveur.o(.text+0x36d):serveur.cpp: undefined reference to `serveur::serveur(int)'
    serveur.o(.text+0x3b9):serveur.cpp: undefined reference to `serveur::start()'
    collect2: ld returned 1 exit status

    make.exe: *** [serv.exe] Error 1
    Après avoir créé l'objet je n'arrive pas à accéder aux fonctions de la class !!!
    Mon "Serveur.h" est correct ?

  9. #9
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    En faite je viens de trouver le problème. J'avais 2 fichiers "main.cpp" et "serveur.h" et je plaçais les fonctions de ma classe dans "serveur.h" alors que je devais les mettre dans "serveur.cpp" (or ce fichier n'existait pas). Alors si j'ai bien compris :
    - dans "class.h" on met les déclarations
    - dans "class.cpp" on met le code des fonctions
    - dans "main.cpp" on appelle les fonctions de la class

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2011, 14h29
  2. Script erreur, comment faire ?!
    Par bikette63 dans le forum VBScript
    Réponses: 3
    Dernier message: 06/12/2006, 15h22
  3. Un message d'erreur intitulé: unknown Hard Error; comment faire SVP
    Par Maman Kakalé Néhémiya dans le forum Ordinateurs
    Réponses: 6
    Dernier message: 14/09/2006, 11h41
  4. Réponses: 4
    Dernier message: 05/06/2006, 11h34
  5. comment faire un group by sans erreur
    Par phpaide dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/04/2006, 09h11

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