Probleme compilation [Résolu]

Signaler
Messages postés
23
Date d'inscription
mercredi 19 mars 2008
Statut
Membre
Dernière intervention
20 juin 2008
-
Messages postés
23
Date d'inscription
mercredi 19 mars 2008
Statut
Membre
Dernière intervention
20 juin 2008
-
Bonjour, j'ai dev c++, et j'ai fais 2 classes avec 1 fichier par classe + le main.
Le compilateur me lance un message d'erreur :

 multiple definition of `Classe1::Fonction1(std::string, int)' 
 first defined here

Et ce message est répété pour toutes les methodes de mes 2 classes

Problème : j'ai pas du tout défini 2 fois ces méthodes ...

8 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
La génération se passe en deux étapes :

D'abord la compilation (produit des fichiers obj). Pour cette étape, le compilateur à besoin de trouver les déclarations des méthodes appelées. A ce stade, ca fonctionne même si tu n'a pas écrit le corps de tes méthodes dans un .cpp.
Ensuite l'édition de lien ca raccorder tous les fichiers obj obtenus lors de la compilation des fichiers cpp. C'est à ce moment qu'est fait le lien entre la déclaration et la définition de méthodes. Donc pour répondre à ta question : c'est en fait l'éditeur de lien qui va s'occuper de trouver les définitions dans les fichiers cpp (elles pourraient d'ailleurs être présentes dans un librairie (fichier.lib) par exemple).

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Le compilateur va comprendre et va chercher tout seul comme un grand les deux fichiers .cpp qui servent de définition des 2 classes ?


Non, il faut inclure les fichiers ".cpp" dans le projet en cours ! Le compilateur en fera autant de fichiers ".obj" que l'éditeurs de liens rassemblera (avec tout ce qu'il aura à prendre dans des bibliothèques externes standard ou personnelles) pour créer LE fichier exécutable.

Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

Ce ne serait pas un problème d'inclusions multiples de fichier(s) d'entête ?

Jean-François
Messages postés
23
Date d'inscription
mercredi 19 mars 2008
Statut
Membre
Dernière intervention
20 juin 2008

Non puisque j'ai inclus le fichier de ma classe2 dans le fichier de ma classe1 qui est lui même inclus dans mon main :

Fichier Classe 2 : rien
Fichier Classe 1 : #include "Fclasse2.cpp"
Fichier Main : #include "Fclasse1.cpp"

Pour moi, il n'y a pas de pb de ce côté là ...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
#include de .cpp, ce n'est pas normal déja. Il faut include des headers, qui contiennent uniquement des déclarations et non des définitions de méthodes.

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Eh oui on inclut comme ça ! Jamais d'include de fichiers source (c/cpp), la conception est mauvaise.

Il faut 1 fichier d'entête (hpp) qui contient la déclaration des 2 classes puis l'inclure dans les 3 fichiers sources. Ou 2 fichiers d'entête, 1 par classe, et les inclure là où c'est nécessaire, y compris dans d'autre(s) fichier(s) d'entête, ça c'est possible !

Jean-François
Messages postés
23
Date d'inscription
mercredi 19 mars 2008
Statut
Membre
Dernière intervention
20 juin 2008

Ok, donc si je met les déclarations des classes dans des headers et que je défini les methodes dans un autre fichier (.cpp)
alors si je fais dans le fichier main :

#include "Hclasse1.h"
#include "Hclasse2.h"

Le compilateur va comprendre et va chercher tout seul comme un grand les deux fichiers .cpp qui servent de définition des 2 classes ?

(Et cela resoudra mon problème ?)
Messages postés
23
Date d'inscription
mercredi 19 mars 2008
Statut
Membre
Dernière intervention
20 juin 2008

D'accord, merci des réponses