Probleme de compilation : "multiple definition"

Probleme de compilation : "multiple definition" - C++ - Programmation

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... :fou:  
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...) :

Code :
  1. MYOS := $(subst -,,$(shell uname))
  2. ROOTCFLAGS    = $(shell root-config --cflags)
  3. ROOTLIBS      = $(shell root-config --libs)
  4. ROOTGLIBS     = $(shell root-config --glibs)
  5. CXXFLAGS     = -O2 -fPIC
  6. CXXFLAGS  += $(ROOTCFLAGS) -DEXE
  7. LIBS  += $(ROOTLIBS) -lMinuit
  8. GLIBS  += $(ROOTGLIBS)
  9. MYOSO := $(OSNAME)
  10. OBJECTDIR= $(MYOSO).o
  11. all: fitARS
  12. $(OBJECTDIR)/%.d : %.C
  13. -@if [ ! -d $(MYOSO).o ] ; then mkdir $(MYOSO).o; fi
  14. @ touch $@.tmp
  15. @ echo "Making dependencies for $<"
  16. @ g++ -MM $(CXXFLAGS) -I/usr/include/g++-2/ $< > $@.tmp
  17. @ sed 's=$(*F)\.o=$(MYOSO).o/$(*F).o=g' $@.tmp > $@.tmp1
  18. @ sed 's=$(*F)\.C.o=$(MYOSO).o/$(*F).o=g' $@.tmp1 > $@
  19. @ $(RM) $@.tmp $@.tmp1 $@.tmp.bak
  20. $(OBJECTDIR)/%.d : %.cxx
  21. -@if [ ! -d $(MYOSO).o ] ; then mkdir $(MYOSO).o; fi
  22. @ touch $@.tmp
  23. @ echo "Making dependencies for $<"
  24. @ g++ -MM $(CXXFLAGS) -I/usr/include/g++-2/ $< > $@.tmp
  25. @ sed 's=$(*F)\.o=$(MYOSO).o/$(*F).o=g' $@.tmp > $@.tmp1
  26. @ sed 's=$(*F)\.C.o=$(MYOSO).o/$(*F).o=g' $@.tmp1 > $@
  27. @ $(RM) $@.tmp $@.tmp1 $@.tmp.bak
  28. $(OBJECTDIR)/%.d : %.cpp
  29. -@if [ ! -d $(MYOSO).o ] ; then mkdir $(MYOSO).o; fi
  30. @ touch $@.tmp
  31. @ echo "Making dependencies for $<"
  32. @ g++ -MM $(CXXFLAGS) -I/usr/include/g++-2/ $< > $@.tmp
  33. @ sed 's=$(*F)\.o=$(MYOSO).o/$(*F).o=g' $@.tmp > $@.tmp1
  34. @ sed 's=$(*F)\.C.o=$(MYOSO).o/$(*F).o=g' $@.tmp1 > $@
  35. @ $(RM) $@.tmp $@.tmp1 $@.tmp.bak
  36. $(OBJECTDIR)/%.o : %.C
  37. $(CXX) -c $(CXXFLAGS) -o $@ $<
  38. $(OBJECTDIR)/%.o : %.cxx
  39. $(CXX) -c $(CXXFLAGS) -o $@ $<
  40. $(OBJECTDIR)/%.o : %.cpp
  41. $(CXX) -c $(CXXFLAGS) -o $@ $<
  42. -include .$(MYOSO).o.d
  43. .$(MYOSO).o.d :
  44. -@if [ ! -d $(MYOSO).o ] ; then mkdir $(MYOSO).o; echo "Making directory $(MYOSO).o"; fi
  45. MonProgObj =  $(OBJECTDIR)/MaClasse1.o $(OBJECTDIR)/MaClasse2.o [...] $(OBJECTDIR)/MonProg.o
  46. MonProg: $(MonProgObj)
  47. $(CXX) $(CXXFLAGS) -o $@ $(MonProgObj) $(LIBS)
  48. -include $(OBJECTDIR)/MonProg.d $(OBJECTDIR)/MaClasse1.d $(OBJECTDIR)/MaClasse2.d [...]
  49. clean:
  50. @rm -rf MonProg $(OBJECTDIR)/ core.* *.o


 
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 :

Citation :

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) :

Citation :

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
Reply

Marsh Posté le 26-08-2006 à 22:41:19   

Reply

Marsh Posté le 26-08-2006 à 23:48:06    

Le code source de MonProg.c et MaClasse1.cpp serait pas de trop je pense.


---------------
Instagram - Mon PVT en Australie.
Reply

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 :
  1. #ifdef EXE
  2. #include "loadlib.h"
  3. #include "MaClasse1.h"
  4. #include "MaClasse2.h"
  5. /* des variables */
  6. /* quelques fonctions */
  7. int main(int argc, char **argv)
  8. {
  9. /* un main tout con */
  10. }
  11. #endif


(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 :
  1. #ifndef MACLASSE1FLAG
  2. #define MACLASSE1FLAG
  3. #include "MonBug.h"
  4. #include "loadlib.h"
  5. class MaClass1
  6. {
  7. /* des declarations */
  8. };
  9. #endif


 
MaClasse1.cxx :

Code :
  1. #include "MaClasse1.h"
  2. MaClasse1::MaClasse1(...){...}
  3. MaClasse1::/* des fonctions, dont certaines appellent celles de MonBug.h */


 
MonBug.h :

Code :
  1. #ifndef MONBUGFLAG
  2. #define MONBUGFLAG
  3. /* des fonctions */
  4. #endif


 
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.

Reply

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*)':
: multiple definition of `fonction1(double*)'
Linux.o/MaClasse1.o(.text+0x0): first defined here
/usr/bin/ld: Warning: size of symbol `fonction1(double*)' changed from 7 in Linux.o/MaClasse1.o to 62 in Linux.o/MonBug.o


 :heink:

Reply

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)...  :??:

Reply

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...  :pt1cable: ).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed