Problème header
Résolu/Fermé34 réponses
et enfin les erreurs:
obj\Debug\generateur.o||In function 'Z19TraitementBoutonGenP10_GtkWidgetPcS1_10Continuite9Isolement':| C:\Documents and Settings\jfaure\Bureau\stage1\testtest\generateur.cpp|8|multiple definition of 'isolement'| obj\Debug\main.o:C:\Documents and Settings\jfaure\Bureau\stage1\testtest\main.cpp|46|first defined here| obj\Debug\generateur.o||In function 'Z19TraitementBoutonGenP10_GtkWidgetPcS1_10Continuite9Isolement':| C:\Documents and Settings\jfaure\Bureau\stage1\testtest\generateur.cpp|9|multiple definition of 'continuite'| obj\Debug\main.o:C:\Documents and Settings\jfaure\Bureau\stage1\testtest\main.cpp|48|first defined here| ||=== Build finished: 4 errors, 0 warnings ===|
En effet, c'est très différent... Ce n'est plus le compilateur qui se plaint, c'est l'éditeur de liens (L I N K E R). Il y a des choses qui sont définies plusieurs fois (d'où l'importance de ne pas confondre définition et déclaration). Je regarde et je te fais signe
Vu le problème...
Dans ton fichier generateur.h, les lignes Isolement isolement; et Continuite continuite; sont de DEFINITIONS de variables (il n'y a pas "extern") et non pas des déclarations.
Quand tu inclus generateur.h dans main.cpp, il crée donc ces variables.
Quand tu inclus generateur.h dans generateur.cpp, il les crée aussi.
Au moment de l'édition de liens, ces variables existent deux fois : c'est ça la double définition
Dans ton fichier .h, il faut mettre
extern Isolement isolement;
extern Continuite continuite;
Ça ce ne sont que des déclarations. Ça ne crée pas de variables, mais ça dit au compilateur qu'elles existent quelque part : tu peux compiler, il les connaît.
Par contre, il faudra bien créer réellement ces variables quelque part (mais une seule fois)
Le plus logique dans ton cas est dans generateur.c :
Isolement isolement;
Continuite continuite;
(pas avant le include generateur.h, sinon il ne connaît pas les types Isolement et Continuite)
Dans ton fichier generateur.h, les lignes Isolement isolement; et Continuite continuite; sont de DEFINITIONS de variables (il n'y a pas "extern") et non pas des déclarations.
Quand tu inclus generateur.h dans main.cpp, il crée donc ces variables.
Quand tu inclus generateur.h dans generateur.cpp, il les crée aussi.
Au moment de l'édition de liens, ces variables existent deux fois : c'est ça la double définition
Dans ton fichier .h, il faut mettre
extern Isolement isolement;
extern Continuite continuite;
Ça ce ne sont que des déclarations. Ça ne crée pas de variables, mais ça dit au compilateur qu'elles existent quelque part : tu peux compiler, il les connaît.
Par contre, il faudra bien créer réellement ces variables quelque part (mais une seule fois)
Le plus logique dans ton cas est dans generateur.c :
Isolement isolement;
Continuite continuite;
(pas avant le include generateur.h, sinon il ne connaît pas les types Isolement et Continuite)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
okok, j'ai capté le truc et j'ai modifié ce qui était à modifier merci beaucoup.
Petit bémol (et tu vas rire):
Je ne sais pas pourquoi l'erreur pour le cheminFichierFil est revenue.
J'ai donc supposé que je pouvais laisser la déclaration: extern gchar* cheminFichierFil; dans le generateur.h et le définir: gchar* cheminFichierFil; dans le generateur.cpp. Mais il ne me le reconnait toujours pas, et je suis obligé de le définir dans le main.cpp.
Une fois défini dans le main (pour vérifier le fonctionnement de l'isolement et de la continuité), j'ai fais ce que tu m'as dis et me retrouve toujours avec une multiple définition...
Désolé d'avoir à t'apprendre ca... ^^
Petit bémol (et tu vas rire):
Je ne sais pas pourquoi l'erreur pour le cheminFichierFil est revenue.
J'ai donc supposé que je pouvais laisser la déclaration: extern gchar* cheminFichierFil; dans le generateur.h et le définir: gchar* cheminFichierFil; dans le generateur.cpp. Mais il ne me le reconnait toujours pas, et je suis obligé de le définir dans le main.cpp.
Une fois défini dans le main (pour vérifier le fonctionnement de l'isolement et de la continuité), j'ai fais ce que tu m'as dis et me retrouve toujours avec une multiple définition...
Désolé d'avoir à t'apprendre ca... ^^
Petit bémol (et tu vas rire): grrr... je l'aurai un jour, je l'aurai... ^^
Je ne sais pas pourquoi l'erreur pour le cheminFichierFil est revenue Effectivement, s'il n'y a pas de définition, c'est normal d'avoir cette erreur. Peux-tu copier le message exact pour vérifier qu'il s'agit bien d'un problème d'édition de lien et non pas de compilation ?
le définir: gchar* cheminFichierFil; dans le generateur.cpp. . Ça devrait être bon... À quelle ligne de ton fichier generateur.c as-tu mis cette ligne ?
As-tu fait un rebuild complet du projet ?
Je ne sais pas pourquoi l'erreur pour le cheminFichierFil est revenue Effectivement, s'il n'y a pas de définition, c'est normal d'avoir cette erreur. Peux-tu copier le message exact pour vérifier qu'il s'agit bien d'un problème d'édition de lien et non pas de compilation ?
le définir: gchar* cheminFichierFil; dans le generateur.cpp. . Ça devrait être bon... À quelle ligne de ton fichier generateur.c as-tu mis cette ligne ?
As-tu fait un rebuild complet du projet ?
Non, c'est un problème de compilation pour la première erreur:
Je l'ai mis au tout début, juste après la ligne #include "generateur.h" (dans generateur.cpp, generateur.c n'existant plus)
J'ai fais un rebuild complet, rien ne change...
C:\Documents and Settings\jfaure\Bureau\stage1\testtest\main.cpp||In function 'int main(int, char**)':| C:\Documents and Settings\jfaure\Bureau\stage1\testtest\main.cpp|110|error: 'cheminFichierFil' was not declared in this scope| ||=== Build finished: 1 errors, 0 warnings ===|
Je l'ai mis au tout début, juste après la ligne #include "generateur.h" (dans generateur.cpp, generateur.c n'existant plus)
J'ai fais un rebuild complet, rien ne change...
J'avoue que je ne comprends pas ... Avant midi, ça, compilait, le problème était à l'édition de liens. Les modifs que je t'ai fait faire à 12h05 n'ont aucun rapport avec cette variable.
Peux-tu revenir à la situation d'avant midi et recréer la même erreur à l'édition de lien, sans erreur de compilation ?
Peux-tu revenir à la situation d'avant midi et recréer la même erreur à l'édition de lien, sans erreur de compilation ?
J'ai essayé, mais à tous les coups j'avais oublié de remettre en commentaire le
gchar* cheminFichierFil = NULL;
dans le main.cpp, du coup il le connaissait forcément.
Si tu veux essayer l'autre problème, je le remet, et ca me donne bien les erreurs du L I N K E R sur la continuité et l'isolement. Même avec seulement les extern dans le .h et sans aucune déclaration.
Pourtant crois-moi, il n'y a que extern Isolement isolement; et pareil pour lla continuité dans le .h ...
Ca commence à devenir de l'acharnement la ... ^^
gchar* cheminFichierFil = NULL;
dans le main.cpp, du coup il le connaissait forcément.
Si tu veux essayer l'autre problème, je le remet, et ca me donne bien les erreurs du L I N K E R sur la continuité et l'isolement. Même avec seulement les extern dans le .h et sans aucune déclaration.
Pourtant crois-moi, il n'y a que extern Isolement isolement; et pareil pour lla continuité dans le .h ...
Ca commence à devenir de l'acharnement la ... ^^
Chaque chose en son temps, commençons par la compilation
As-tu bien un seul fichier generateur.h ? Tes 3 fichiers sont-ils bien dans le même répertoire ?
As-tu bien un seul fichier generateur.h ? Tes 3 fichiers sont-ils bien dans le même répertoire ?
Mes 3 fichiers sont dans le même répertoire et je n'ai qu'un .h
j'ai un "generateur.h.gch" par contre c'est pas gênant?
j'ai un "generateur.h.gch" par contre c'est pas gênant?
Ça m'étonnerait que ça le dérange... Dans le doute, peux-tu le déplacer ou le renommer ?
En essayant de reproduire ton cas de figure chez moi, j'ai vu qu'il n'acceptait pas les points dans les define. Peux-tu au début de generateur.h remplacer
#ifndef generateur.h
#define generateur.h
par
#ifndef generateurh
#define generateurh
En essayant de reproduire ton cas de figure chez moi, j'ai vu qu'il n'acceptait pas les points dans les define. Peux-tu au début de generateur.h remplacer
#ifndef generateur.h
#define generateur.h
par
#ifndef generateurh
#define generateurh
YOUHOOOO ! ! !
Ca marche !
Du coup j'ai fais l'isolement et la continuité tout seul grace à tes explications.
Tout ca pour 2 petits points ...
Merci énormément !
T'as fini par l'avoir ^^
Ca marche !
Du coup j'ai fais l'isolement et la continuité tout seul grace à tes explications.
Tout ca pour 2 petits points ...
Merci énormément !
T'as fini par l'avoir ^^