Mutiples definitions avec g++

Résolu
xbabilone Messages postés 47 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 7 janvier 2018 - Modifié par cptpingu le 21/01/2015 à 11:18
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 21 janv. 2015 à 22:59
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 janv. 2015 à 11:26
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
0
xbabilone Messages postés 47 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 7 janvier 2018 2
Modifié par xbabilone le 21/01/2015 à 20:11
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 .
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 janv. 2015 à 22:59
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
0
Rejoignez-nous