Rechercher : dans
Par :

Probleme fichier .h .cpp compilation c++

Dernière réponse le 9 jan 2008 à 16:34:05 corleone, le 9 jan 2008 à 14:19:52 
 Signaler ce message aux modérateurs

Bonjour,
Je dois écrire un programme en c++ et je rencontre un probleme lors de la compilation avec dev c++ (même problème avec borland c++5.5):

Compilateur: Default compiler
Execution de g++.exe...
g++.exe "C:\Users\****\Desktop\Pro\mainResto.cpp" -o "C:\Users\****\Desktop\Pro\mainResto.exe" -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -I"C:\Users\****\Desktop\Pro" -L"C:\Dev-Cpp\lib"
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x290):mainResto.cpp: undefined reference to `client::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x2c7):mainResto.cpp: undefined reference to `client::mange(int)'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x3a4):mainResto.cpp: undefined reference to `client::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x40c):mainResto.cpp: undefined reference to `sportif::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x443):mainResto.cpp: undefined reference to `sportif::mange(int)'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x520):mainResto.cpp: undefined reference to `sportif::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x59a):mainResto.cpp: undefined reference to `habitue::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x5d1):mainResto.cpp: undefined reference to `client::mange(int)'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x757):mainResto.cpp: undefined reference to `habitue::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN6clientD1Ev[client::~client()]+0xb):mainResto.cpp: undefined reference to `vtable for client'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN7sportifD1Ev[sportif::~sportif()]+0xb):mainResto.cpp: undefined reference to `vtable for sportif'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN6clientD2Ev[client::~client()]+0xb):mainResto.cpp: undefined reference to `vtable for client'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN7habitueD1Ev[habitue::~habitue()]+0xb):mainResto.cpp: undefined reference to `vtable for habitue'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN7habitueC1Edi[habitue::habitue(double, int)]+0x101):mainResto.cpp: undefined reference to `vtable for habitue'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN6clientC2EdSs[client::client(double, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0xe):mainResto.cpp: undefined reference to `vtable for client'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN7sportifC1Ev[sportif::sportif()]+0x104):mainResto.cpp: undefined reference to `vtable for sportif'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN6clientC1EdSs[client::client(double, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0xe):mainResto.cpp: undefined reference to `vtable for client'
collect2: ld returned 1 exit status

Execution terminee

Si je place toutes les fonctions présentes des .cpp dans les .h, alors ça fonctionne parfaitement. Mais je dois absolument rendre mon projet avec des .cpp et des .h séparés.
voici les differents fichiers:


//mainresto.cpp

#include <cstdio>
#include "client.h"
#include "habitue.h"
#include "sportif.h"
#include <string>
#include <iostream>


using namespace std;

int main()
{

cout <<"nouveau client\n"<<endl;
client cl1;// creation d'un nouveau client
cl1.affiche(); // affichage des attributs du nouveau client (nom et nb de calories, par defaut)
cout <<"\n"<<endl;
cl1.mange(150);
cl1.changeNom("Mr machin");
cl1.affiche();
cout <<"\n"<<endl;
cout <<"nouveau sportif\n"<<endl;
sportif cl2;
cl2.affiche();
cout <<"\n"<<endl;
cl2.mange(500);
cl2.changeNom("Mr Chose");
cl2.affiche();
cout <<"\n"<<endl;
cout <<"nouvel habitue\n"<<endl;
habitue cl3;
cl3.affiche();
cout <<"\n"<<endl;
cl3.mange(200);
cl3.changeNom("Mme Truc");
cl3.affiche();

// client.cpp

#include "client.h"
#include <string>
#include <cstdio>
#include <iostream>

using namespace std;

void client::affiche() {
cout << "nom : " << nom <<"\n Calories ingurgitees : " << nbCalAccu << endl;
}

double client::mange (int qttNour){
nbCalAccu += qttNour;
return nbCalAccu;
}


//client.h

#ifndef CLIENT_H
#define CLIENT_H
#include <string>
#include <iostream>
#include <ctime>

using namespace std;

class client{ public:
string nom;
double nbCalAccu;
client(double calo=3000 , string nm ="monsieur X") : nbCalAccu(calo) , nom(nm) {};
void changeNom(string nvnom){
nom = nvnom;
return;
}
virtual void affiche() ;
virtual double mange (int qttNour);
};

#endif

//habitue.cpp
#include "client.h"
#include "habitue.h"
#include <string>
#include <cstdio>
#include <iostream>

using namespace std;

void habitue::affiche(){
client :: affiche();
cout << "anciennete : " << annees <<" ans" << endl;
}


//habitue.h

#ifndef HABITUE_H
#define HABITUE_H
#include <string>
#include <ctime>

using namespace std;

class habitue : public client { public:
int annees;
//double nbCalAccu;
habitue (double calo = 5000 , int ans = 3) : client(calo), annees(ans) {};
void affiche();
};

#endif

Désolé pour le message très long mais je préfère vous donner tout le code (même si je n'ai pas mis les fichiers "sportifs" qui sont construits exactement comme "habitue").

Merci d'avance de vos réponses. J'espère que vous pourrez m'aider, ça fait 4 jours que je bloque là dessus...

Configuration: Windows Vista
Firefox 2.0.0.11
dev c++

Meilleures réponses pour « probleme fichier .h .cpp compilation c++ » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Compiler un programme en C avec Dev C++ sous Vista VoirIl est très probable que vous ayez des problèmes lors de la compilation d'une source C sous Vista avec Dev C++. Solution rapide de secours: le compilateur g++ Voici une astuce pour Dev-Cpp : Aller dans "Outils" -> "Options du compilateur" puis...
Fichier CUE VoirFormat CUE Les fichiers [bin.php3 BIN] et CUE sont respectivement : .BIN : une image de CD, c'est-à-dire une copie binaire d'un CD-ROM ou d'un DVD-ROM sous forme d'un fichier pouvant être stocké sur disque dur. .CUE : informations sur les...
Qu'est-ce qu'un fichier? VoirQu'est-ce qu'un fichier? Un fichier est une suite d'informations binaires, c'est-à-dire une suite de 0 et de 1. Ce fichier peut être stocké pour garder une trace de ces informations. Un fichier texte est un fichier composé de caractères stockés...
Java - Caractéristiques du langage VoirFichier source, compilation et machine virtuelle Le fichier source d'un programme écrit en Java est un simple fichier texte dont l'extension est par convention .java. Ce fichier source doit être un fichier texte non formatté, c'est-à-dire un...

1

le père, le 9 jan 2008 à 14:29:07

Bonjour

Je m'en tiens au premier message d'erreurs, la plupart des autres ont l'air d'être dus au même problème

dans mainresto.cpp, tu utilises la méthode affiche de la classe client, mais cette méthode n'est déclarée nulle part . Elle n'apparaît pas dans client.h
il FAUT la définir, ou au moins la déclarer, dans client.h, le compilateur n'a pas les moyens de la deviner.

Répondre à le père

2

Char Snipeur, le 9 jan 2008 à 14:57:37

Affiche est bien déclarer dans client.h.
J'ai plutôt l'impression que tu a oublié de compiler TOUT les .cpp avant de faire le lien.
Avec DevCpp, quand tu as plusieurs fichier sources (.cpp) il faut créer un projet pour compiler correctement.
Salutation ! Quand on sait pas, on touche pas !JBT
Char Snipeur

Répondre à Char Snipeur

3

le père, le 9 jan 2008 à 15:08:02

Désolé. Je ferais mieux de faire la sieste...

Répondre à le père

4

corleone, le 9 jan 2008 à 15:13:25

Merci pour vos réponses.
le problème est que j'ai fait un projet avant de compiler sous dev c++. Et avant ça, j'avais essayé de compiler avec borland c++, en compilant chaque cpp... mais toujours ces erreurs...
au cas où j'ai mal fait la manip sous dev c++, peux-tu m'expliquer en détails la démarche?
Merci encore

Répondre à corleone

5

Char Snipeur, le 9 jan 2008 à 15:37:56

Dans DevCpp tu crée un projet, puis tu ajoute tout te fichiers source. Et normalement ça fonctionne.
Le mieux est peux être de le faire à la main, tu commence par créer les fichier object :
g++ -c *.cpp I...
une foi que tout tes .cpp sont transformer en .o tu les lie ensemble
g++ *.o -o prog.exe -L... etc.
Salutation ! Quand on sait pas, on touche pas !JBT
Char Snipeur

Répondre à Char Snipeur

6

 corleone, le 9 jan 2008 à 16:34:05

Merci beaucoup!! Ca fonctionne enfin!!!!
(enfin pour l'instant!)
Bonne fin de journée et encore merci!!!!

Répondre à corleone