Kelm0
Messages postés23Date d'inscriptionmercredi 19 mars 2008StatutMembreDernière intervention20 juin 2008
-
24 mai 2008 à 13:41
Kelm0
Messages postés23Date d'inscriptionmercredi 19 mars 2008StatutMembreDernière intervention20 juin 2008
-
24 mai 2008 à 19:06
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 ...
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201013 24 mai 2008 à 16:33
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).
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 24 mai 2008 à 17:48
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.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201013 24 mai 2008 à 15:45
#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.
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 24 mai 2008 à 16:21
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 !
Kelm0
Messages postés23Date d'inscriptionmercredi 19 mars 2008StatutMembreDernière intervention20 juin 2008 24 mai 2008 à 16:27
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 ?