Probleme de compilation : "multiple definition" - C++ - Programmation
Marsh Posté le 26-08-2006 à 23:48:06
Le code source de MonProg.c et MaClasse1.cpp serait pas de trop je pense.
Marsh Posté le 27-08-2006 à 00:09:51
Euh... Si t'insistes et que t'as que ca a faire de dechiffrer quelques milliers de lignes de code tout crade (mon but etant justement de lui faire un joyeux nettoyage de printemps) (bon, j'exagere un peu, c'est pas tout le code qui bugue non plus), je veux bien t'en faire un tar.gz ?
Mais je vais essayer d'etre un peu plus clair avec des bouts de codes :
MonProg.C :
Code :
|
(Le loadlib.h contient plein de #includes que j'ai pas envie de me retaper a chaque fois. Je sais c'est peut-etre pas une super idee niveau perfs, mais c'est tellement plus simple quand on a 10 ou 20 #includes a mettre dans chaque prog... Et il ne contient ni MaClasse1.h ni MonBug.h.)
MaClasse1.h :
Code :
|
MaClasse1.cxx :
Code :
|
MonBug.h :
Code :
|
Les autres MaClasseX.h ne posent pas de problemes puisque je les utilise deja dans d'autres programmes. MonBug.h n'est include que par MaClasse1.h, MaClasse1.h n'est inclue que par MaClasse1.cxx et MonProg.C, et MonProg.C n'est appele nulle part. les fonctions de MonBug.h ne sont appelees que par MaClasse.cxx.
Marsh Posté le 27-08-2006 à 01:06:09
Bon, j'ai essaye de separer MonBug.h en deux composantes MonBug.h et MonBug.cxx, ce que je voudrais absolument eviter (je n'ai pas ecrit ce fichier, et il n'a absolument pas une structure de classe mais ce sont juste des fonctions d'inversion de matrices codees en dur, un truc tout pas beau que j'vous raconte meme pas...), je l'ai rajoute dans le Makefile, et... C'EST PIRE !!!
Maintenant, EN PLUS des erreurs precedentes, j'ai ca :
Citation : Linux.o/MonBug.o(.text+0x0): In function `fonction1(double*)': |
Marsh Posté le 27-08-2006 à 01:16:56
Bon, grace a l'option -g de g++ (celle qui montre les lignes), j'ai pu m'apercevoir que c'est bien le fichier MonBug.h qui est appele deux fois : une fois par MaClasse1.h, et une autre fois par MonProg.C --- certainement par l'intermediaire du #include MaClasse1.h. Oui mais alors, comment se fait-ce que le #ifndef MONBUGFLAG ne reagisse pas ? En plus le #include MaClasse1.h, je suis oblige de le faire deux fois (dans MonProg.C et MaClasse1.cxx)...
Marsh Posté le 27-08-2006 à 02:26:27
Bon, solution provisoire en attendant votre aide : j'ai mis tout le code de MonBug.h dans MaClasse1. Mais je ne veux pas que ca reste ainsi, rien que de l'avoir fait ca m'a donne des frissons dans le dos, et je sens que je vais en faire des cauchemards... Si j'osais, je vous mettrais le MonBug.h en copie... Bon, promis, je le ferai des que le probleme sera resolu, pour feter ca (662 lignes de serie Z... ).
Marsh Posté le 26-08-2006 à 22:41:19
Salut,
Ca fait des heures que je suis en train de me prendre la tete sur un probleme de compilation...
En fait j'essaie de nettoyer un programme en le mettant sous forme de classes, et notamment en transformant un .hh en (.h + .cxx).
Voila mon Makefile (copie ailleurs, j'y pige pas grand'chose...) :
J'ai bien des #ifndef MACLASSE1 #define MACLASSE1 [...] #endif dans toutes mes classes, ce Makefile fonctionne farpaitement avec d'autres progs, et pourtant ici j'ai des erreurs de compilation du type :
Linux.o/MonProg.o(.text+0x0): In function `fonction1(double*)':
: multiple definition of `fonction1(double*)'
Linux.o/MaClasse1.o(.text+0x0): first defined here
Les fonctions viennent toutes du meme fichier MonBug.h, qui est appele une seule fois, par un #include dans le fichier MaClasse.h.
Je vois vraiment pas d'ou peut venir le probleme, donc si quelqu'un avait ne serait-ce qu'un debut de piste a me proposer... Merci d'avance.
EDIT : Ca peut peut-etre aider, les messages de compilation (et je travaille sous linux avec g++ et ROOT) :
Making dependencies for MaClasse1.cxx
Making dependencies for MaClasse2.cxx
[...]
Making dependencies for MonProg.C
g++ -c -O2 -fPIC -pthread -I/apps/root/5.08-00-gcc3.2.3/root/include -DEXE -o Linux.o/MaClasse1.o MaClasse1.cxx
g++ -c -O2 -fPIC -pthread -I/apps/root/5.08-00-gcc3.2.3/root/include -DEXE -o Linux.o/MaClasse2.o MaClasse2.cxx
[...]
g++ -c -O2 -fPIC -pthread -I/apps/root/5.08-00-gcc3.2.3/root/include -DEXE -o Linux.o/MonProg.o MonProg.C
g++ -O2 -fPIC -pthread -I/apps/root/5.08-00-gcc3.2.3/root/include -DEXE -o MonProg Linux.o/MaClasse1.o Linux.o/MaClasse2.o [...] Linux.o/MonProg.o -L/apps/root/5.08-00-gcc3.2.3/root/lib -lCore -lCint -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -pthread -lm -ldl -rdynamic -lMinuit
EDIT2 : Le probleme ne doit pas venir d'une declaration de fonctions avec le meme nom dans une lib de ROOT car je n'ai pas de probleme de compilation avec le .hh (compilation pour laquelle le Makefile a une forme un peu differente).
Message édité par SkippyleGrandGourou le 26-08-2006 à 22:56:13