Erreur lancée par le linker

Erreur lancée par le linker - C++ - Programmation

Marsh Posté le 20-06-2005 à 21:09:39    

Bonjour à tous,  
 
j'ai fait une recherche sur le forum, mais, j'ai pas trouvé de quoi m'aider..
Mon problème de newbie est le suivant, j'ai deux fichiers, dans le premier, je déclare une classe et dans le deuxieme, je voudrais instancier un objet de cette classe...
donc j'ai mis un include du premier fichier dans le deuxieme fichier...ca compile mais erreur lors du linkage..
voici la log:

Citation :

Compilateur: Default compiler
Building Makefile: "C:\Dev-Cpp\Makefile.win"
Exécution de  make...
make.exe -f "C:\Dev-Cpp\Makefile.win" all
g++.exe -c SansNom1.cpp -o SansNom1.o -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"    
 
g++.exe -c SansNom2.cpp -o SansNom2.o -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"    
 
g++.exe SansNom1.o SansNom2.o  -o "Projet1.exe" -L"C:/Dev-Cpp/lib"  
 
SansNom2.o(.text+0x0):SansNom2.cpp: multiple definition of `MyFrame::GetEventTable() const'
SansNom1.o(.text+0x0):SansNom1.cpp: first defined here
SansNom2.o(.text+0xa):SansNom2.cpp: multiple definition of `MyFrame::GetEventHashTable() const'
SansNom1.o(.text+0xa):SansNom1.cpp: first defined here
SansNom2.o(.text+0x14):SansNom2.cpp: multiple definition of `MyFrame::MyFrame(wxString const& )'
SansNom1.o(.text+0x14):SansNom1.cpp: first defined here
SansNom2.o(.text+0x76a):SansNom2.cpp: multiple definition of `MyFrame::MyFrame(wxString const& )'
SansNom1.o(.text+0x76a):SansNom1.cpp: first defined here
SansNom2.o(.text+0xec0):SansNom2.cpp: multiple definition of `MyFrame::OnQuit(wxCommandEvent& )'
SansNom1.o(.text+0xec0):SansNom1.cpp: first defined here
SansNom2.o(.rdata+0x0):SansNom2.cpp: multiple definition of `MyFrame::sm_eventTable'
SansNom1.o(.rdata+0x0):SansNom1.cpp: first defined here
SansNom2.o(.bss+0x20):SansNom2.cpp: multiple definition of `MyFrame::sm_eventTableEntries'
SansNom1.o(.bss+0x20):SansNom1.cpp: first defined here
SansNom2.o(.bss+0x0):SansNom2.cpp: multiple definition of `MyFrame::sm_eventHashTable'
SansNom1.o(.bss+0x0


 
etc...etc...j'ai pas tout mis, mais ce sont des erreurs de ce gout la...
 
j'utilise wxwigets et dev-c++
 
si vous avez une idée..
 
PaowZ

Reply

Marsh Posté le 20-06-2005 à 21:09:39   

Reply

Marsh Posté le 20-06-2005 à 21:36:39    

Tu n'aurais pas oublié de protéger ton .h contre les inclusions multiples, par hasard ?

Reply

Marsh Posté le 20-06-2005 à 21:38:10    

GCC ne gere pas automatiquement ce genre de soucis ?
Car quand on mets #pragma once il dit que c'est deprecated

Reply

Marsh Posté le 20-06-2005 à 21:41:46    

#pragma once n'est pas portable.
D'ailleurs, #pragma, ce sont des commandes non portables par définition, c'est pour ça qu'il faut en utiliser le moins possible.
 
Donc faire comme d'habitude :
#ifndef MACHIN_H_
#define MACHIN_H_
#endif

Reply

Marsh Posté le 20-06-2005 à 22:48:33    

NON ON NE FAIT JAMAIS MACHIN_H !
 
ON FAIT __TOUJOURS__ DUPONT_MACHIN_PROJET_DATE_H ! :o

Reply

Marsh Posté le 20-06-2005 à 22:50:45    

Quel est l'intérêt ? Pour éviter des collisions entre libs ?


Message édité par el muchacho le 20-06-2005 à 22:52:59
Reply

Marsh Posté le 20-06-2005 à 22:59:10    

ben oui. tu crois que y a combien de blaireau dans le monde qui ont écrit un STACK_H !

Reply

Marsh Posté le 21-06-2005 à 10:58:37    

ouais, c'est pas impossible le coup des inclusions multiples, en effet...
mais à quel moment, cela se produirait?

Reply

Marsh Posté le 21-06-2005 à 11:44:33    

ben quand deux blaireaux on fais un STACK_H dans leur fichiers

Reply

Marsh Posté le 21-06-2005 à 11:50:50    

ah??
ok...
sinon, j'ai essayé de mettre un #ifndef etc...et je suis pas arrivé à linker..toujours multiple definitions...
question: je dois bien mettre la directive dans le fichier ou il y a ma classe que je veux instancier, c'est bien ca? (soit dans le premier fichier)

Reply

Marsh Posté le 21-06-2005 à 11:50:50   

Reply

Marsh Posté le 21-06-2005 à 11:52:51    

montre ton .h

Reply

Marsh Posté le 21-06-2005 à 11:58:02    

LOL
faut un .h??

Reply

Marsh Posté le 21-06-2005 à 12:00:13    

en fait, je vais fixer le truc..I'm a C++beginner..je m'y interesse parce que ca fait quelques années que je faisais un peu de java, j'avais envie de changer par curiosité. :D
 
donc, j'ai lu un peu de doc sur le C++, un bouquin d'un mec, aussi...mais c'est pas évident de démarrer sur quelques chose...
donc, dans mon .h, je dois définir quoi ? ma classe ?


Message édité par paowz le 21-06-2005 à 12:00:34
Reply

Marsh Posté le 21-06-2005 à 12:48:48    

Et si tu lisais le fuckin'manual un peu, avant de venir poser des questions dont la réponse se trouve dans tous les bouquins de C++ ?

Reply

Marsh Posté le 21-06-2005 à 12:53:21    

c'est pas une mauvaise idée, mais parfois c'est chaud de trouver une réponse à une question dont on a déjà du mal à trouver le sens...faut savoir par où commencer à chercher..:)

Reply

Marsh Posté le 21-06-2005 à 14:31:27    

bon...me suis fait un fichier .h... ca ressemble à ça:

Code :
  1. #ifndef WX_PRECOMP
  2.     #include "wx/wx.h"
  3. #endif
  4. class MyApp : public wxApp
  5. {
  6. public:
  7.     virtual bool OnInit();
  8. };
  9. class MyFrame : public wxFrame
  10. {
  11. public:
  12.     MyFrame(const wxString& title);
  13.     void OnQuit(wxCommandEvent& event);
  14. private:
  15.     DECLARE_EVENT_TABLE()
  16. };


 
voilà, donc j'implémente dans un .cpp ces deux classes, ca compile, mais toujours pas de linkage avec pour message d'erreur principal : undefined reference.
une idée??

Reply

Marsh Posté le 21-06-2005 à 14:56:40    

manque un destructeur virtuel.
 
Et maintenant, t'arrêtes de nous saouler, tu relis le topic, ton .h il est pourri

Reply

Marsh Posté le 21-06-2005 à 14:58:45    

ok...ok..j'arrete de vous saouler...
merci à vous qd même.
bonne continuation...:)

Reply

Marsh Posté le 22-06-2005 à 13:14:51    

en fait, dans dev-c++, il faut créer un projet wxwidgets et non pas un projet vide...sinon ca initialise pas les paths pour le linker..
merci à toi, le tazé :)

Reply

Sujets relatifs:

Leave a Replay

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