Mutiples definitions avec g++ [Résolu]

Signaler
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Statut
Membre
Dernière intervention
7 janvier 2018
-
Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
-
Bonjour à tous et bonne année.

J'ai g++ qui se plaint de multiples definitions.
La solution est certainement simple mais je ne la vois pas.

J'ai une classe déclarée dans un fichier .hpp ;
class.hpp
#ifndef _class
#define _class
// ...
// ...
// ...
#endif

J'ai ma classe définie dans un fichier .cc qui appelle mon fichier class.hpp
Dans mon projet, j'appelle aussi mon fichier class.hpp
Je me retrouve avec un message d'erreur qui me parle de multiples declarations sur tous les termes de ma classe, du genre:

/tmp/ccYSzI7u.o: dans la fonction « CString::toLowerCase() »:
main.cc:(.text+0x26c0): définitions multiples de « CString::toLowerCase() »
/tmp/ccrhWEf7.o:Hash.cc:(.text+0x26c0): défini pour la première fois ici

Je n'avais pas ce problème quand j'avais la définition et la déclaration dans le même fichier
Alors quelle stratégie adopter pour avoir l'air sérieux, et garder un fichier .hpp et un fichier .cpp ?

Edit admin: correction orthographe, mise en forme, coloration.

3 réponses

Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
Bonjour.

Difficile à dire en ne "voyant" rien. Je te fais un exemple propre et fonctionnel:

MyClass.hpp
#ifndef MY_CLASS_HH_
# define MY_CLASS_HH_

# include <string>

class MyClass
{
public:
  std::string toLower() const;
};

#endif /* !MY_CLASS_HH_ */


MyClass.cc
#include "MyClass.hpp"

std::string
MyClass::toLower() const
{
  return "test";
}


main.cc
#include "MyClass.hpp"
#include <iostream>

int main()
{
  MyClass my_class;
  std::cout << my_class.toLower() << std::endl;

  return 0;
}


Compiler via:
g++ -W -Wall MyClass.cc main.cc


__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Statut
Membre
Dernière intervention
7 janvier 2018
2
Salut a toi .


J'ai ajouté ce fichier avec les tiens

bool.hpp :

/////////////////////////////////////////////
#ifndef _BOOL
# define _BOOL

bool ready=true;


#endif
//////////////////////////////////////////////





Puis j'ai ajouté : #include "bool.hpp" comme suit dans "MyClass.hpp"

//////////////////////////////////////////////////////
#ifndef MY_CLASS_HH_
# define MY_CLASS_HH_


#include "bool.hpp" // modif ici

# include <string>

class MyClass
{
public:
std::string toLower() const;
};

#endif /* !MY_CLASS_HH_ */

//////////////////////////////////////////////////////



puis je fais : g++ -W -Wall MyClass.cc main.cc

et j'obtiens :


$ g++ -W -Wall MyClass.cc main.cc
/tmp/ccX7G63J.o:(.data+0x0): définitions multiples de « ready »
/tmp/ccCSqaPw.o:(.data+0x0): défini pour la première fois ici
collect2: error: ld returned 1 exit status


Je t'ai fait un exemple avec ma variable ready .
Je cherche a regler le probleme quand il y a surtout une classe complete


Merci d'avance pour ta reponse .
Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
Pense à la coloration syntaxique, s'il te plaît. Ce n'est pas la première fois et c'est très désagréable à relire :(

Pour ton souci, c'est normal. "bool ready=true;" est du code, tandis que "bool ready;" est une déclaration. Donc l'un peut aller dans un header et pas l'autre. Il te faut donc faire:

Dans ton header:
bool ready;

Dans un fichier de code à part:
bool ready=true;

Et ça devrait être bon. Néanmoins je te déconseille fortement l'utilisation de variables globales (signe d'un code pourri :p).

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature