Mutiples definitions avec g++ [Résolu]

Messages postés
47
Date d'inscription
vendredi 18 février 2005
Dernière intervention
7 janvier 2018
-
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.
Afficher la suite 

Votre réponse

3 réponses

Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 novembre 2018
0
Merci
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
Commenter la réponse de cptpingu
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Dernière intervention
7 janvier 2018
0
Merci
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 .
Commenter la réponse de xbabilone
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 novembre 2018
0
Merci
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
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.