[Rayzolu] Problème de linkage à la compilation

Problème de linkage à la compilation [Rayzolu] - C++ - Programmation

Marsh Posté le 27-02-2006 à 15:31:32    

Voilà je suis sous Visual C++ et j'ai un problème de compilation : au linkage j'ai droit à ce beau message d'erreur :
 
main.obj : error LNK2005: "private: static int Analyse::size_tab" (?size_tab@Analyse@@0HA) already defined in analyse.obj
main.obj : error LNK2005: "private: static char (* Analyse::tab_analyse)[30]" (?tab_analyse@Analyse@@0PAY0BO@DA) already defined in analyse.obj
 
J'ai cru comprendre que cette erreur est dûe à l'inclusion 2 fois du analyse.h mais je vois pas trop comment résoudre le problème.
 
analyse.h :  
 

Code :
  1. #ifndef __ANALYSE__
  2. #define __ANALYSE__
  3. #include <iostream>
  4. #include "correction.h"
  5. #define TAILLEMOT 30
  6. class Analyse : public Correction
  7. {
  8. private :
  9. static char tab_analyse [][TAILLEMOT];
  10. static int size_tab;
  11. public :
  12. Analyse (char *);
  13. ~Analyse();
  14. };
  15. char Analyse::tab_analyse [][TAILLEMOT] = {"create", "displayall", "move", "put"};
  16. int Analyse::size_tab = 4;
  17. #endif


 
correction.h :
 

Code :
  1. #ifndef __CORRECTION__
  2. #define __CORRECTION__
  3. #include <iostream>
  4. #define TAILLEMOT 30
  5. class Correction
  6. {
  7. private
  8.   char (*modele) [TAILLEMOT];
  9.   char *acomparer;
  10.   int tabsize;
  11. public :
  12.           inline int size (const char *) const;
  13.   inline bool identique (const char *,const  char *) const;
  14.   inline int comparaison (const char *,const  char *) const;
  15.   inline bool compareEqualSize (const char *, const char *) const;
  16.   inline bool compareMinusSize (const char *,const  char *) const;
  17.   inline bool comparePlusSize (const char *, const char *) const;
  18.   char* getModifiedString () const;
  19. Correction (char *param, char tabparam [][TAILLEMOT], const int size);
  20. Correction();
  21. ~Correction ();
  22. };
  23. #include "fonctions.inl"
  24. #endif


 
main.cpp :  

Code :
  1. #include <iostream.h>
  2. #include "analyse.h"
  3. #include "create.h"
  4. void main ()
  5. char param[16];
  6. char nomforme [16];
  7. char libelle[16];
  8. char couleur[16];
  9. char coordonnes [16];
  10. cout << "Veuillez entrer le nom de votre forme, le libelle de votre forme, sa couleur,";
  11.         cout << " et ses coordonnees entre parentheses et separees d'une virgule\n";
  12. cin >> param >> nomforme >> libelle >> couleur >> coordonnes;
  13.   Analyse analyse (param);
  14.   if (analyse.getModifiedString()==NULL)
  15.  cout << "Le premier mot que vous avez entre n'appartient pas au vocabulaire";
  16.                 cout << "de ce programme, veuillez modifier votre premier mot";
  17.   else
  18.   cout << "\n" << analyse.getModifiedString();
  19.   if (analyse.identique(analyse.getModifiedString(), "displayall" ))
  20.   {
  21.   cout << "\nAFFICHER TOUT"; 
  22.   }
  23. }


Message édité par vouzico le 27-02-2006 à 15:54:21
Reply

Marsh Posté le 27-02-2006 à 15:31:32   

Reply

Marsh Posté le 27-02-2006 à 15:45:44    

Citation :

J'ai cru comprendre que cette erreur est dûe à l'inclusion 2 fois du analyse.h mais je vois pas trop comment résoudre le problème.


Je ne pense pas : visiblement, tes headers sont protégés contre les inclusions multiples. En plus, si tes prototypes de classes apparaissaient plusieurs fois, ton compilateur gueulerait au moment de la compilation et n'atteindrait pas l'étape de link.

Reply

Marsh Posté le 27-02-2006 à 15:48:55    

J'ai oublié de préciser que le compilo gueule plus particulièrement sur les lignes 15 et 16 de analyse.h ....


Message édité par vouzico le 27-02-2006 à 15:51:34
Reply

Marsh Posté le 27-02-2006 à 15:51:19    

voila ce qui arrive quand on mets des definitions dans un en-tete, faut les mettres dans un .cpp

Reply

Marsh Posté le 27-02-2006 à 15:53:27    

skelter a écrit :

voila ce qui arrive quand on mets des definitions dans un en-tete, faut les mettres dans un .cpp


 
Effectivement  
 
Merci bien :jap:

Reply

Marsh Posté le 27-02-2006 à 15:55:36    

les définitions de Analyse::size_tab et Analyse::tab_analyse sont compilées une fois dans analyse.obj et une autre fois dans main.obj. Du coup, le linker se retrouve avec deux versions de la même variable.
 
Il faut que tes définitions n'apparaissent pas dans le header, mais dans l'un (et seulement un) des deux .cpp

Reply

Marsh Posté le 27-02-2006 à 15:56:08    

vouzico a écrit :

Effectivement  
 
Merci bien :jap:


 
Maykelboulay [:ddr555]


Message édité par ParadoX le 27-02-2006 à 15:56:24

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed