undefined reference
-
Hallo ich bin dabei ein Simulationsprogramm zu schreiben aber der Compiler bzw. der Linker bringt mir folgende Fehler:
e:\simulationmain.o(.text+0xab):simulationmain: undefined reference to `Queue<Event>::Queue(void)' e:\simulationmain.o(.text+0x2a5):simulationmain: undefined reference to`Queue<Event>::~Queue(void)' e:\simulationmain.o(.text+0x339):simulationmain: undefined reference to `Queue<Event>::length(void)' e:\simulationmain.o(.text+0x351):simulationmain: undefined reference to `Queue<Event>::length(void)' e:\simulationmain.o(.text+0x3a8):simulationmain: undefined reference to `Queue<Event>::add(Event)' e:\simulationmain.o(.text+0x3c8):simulationmain: undefined reference to `Queue<Event>::length(void)' e:\simulationmain.o(.text+0x4bf):simulationmain: undefined reference to `Queue<Event>::remove(void)' e:\simulationmain.o(.text+0x4df):simulationmain: undefined reference to `Queue<Event>::length(void)' e:\simulationmain.o(.text+0x50c):simulationmain: undefined reference to `Queue<Event>::front(Event &)' e:\simulationmain.o(.text+0x5f4):simulationmain: undefined reference to `Queue<Event>::~Queue(void)' e:\simulationmain.o(.text+0x6d7):simulationmain: undefined reference to `Queue<Event>::~Queue(void)' e:\simulationmain.o(.text+0x774):simulationmain: undefined reference to `Queue<Event>::~Queue(void)'
aber ich komme einfach nicht darauf was da falsch sein könnte.
ich kann jetzt nur nicht den ganzen Quellcode posten aber wenn jemand ne Idee hat oder ne bestimmte Datei braucht...
Schreibt's einfach.
Danke im vorraus
-
linkerfehler heißen, daß er die implementierungen der methoden nicht findet.
du kündigst ihm die mehtoden durch einen header an, aber gibst ihm keine obj.sprich: entweder eine .lib mit dll, oder .so (linux), oder eben den quellcode.. mitlinken.
-
der linker sagt dir im prinzip nur, dass er die implementierung der o.g. funktionen nicht finden kann.
hast du die funktionen implementiert? hast du alle nötigen (wenn nötig) librarys eingebunden?
/edit: (kristallkugel flackert) Queue ist ein template?
hast du die definitionen für die templatefunktionen im header bzw. die zugehörige .cpp/.cc datei inkludiert?
-
moment also ich dachte immer ich müsse nur die Heade-Datei includieren wieso die cpp Datei????
Aber sonst habe ich die Funktionen implementiert und auch alle Libs eingebunden würde ich sagen und wenn es nicht so wäre würde ich ja auch schon einen Compilerfehler bekommmen oder??
-
nein
mit dem header kündigst du an, das irgendwo später die implementierung kommt.
der compiler glaubt dirdu erklärst (deklarierst) also machst bekannt.
der linker linkt zusammen, und schimpft, wenn dann was fehlt. dir fehlt also eine lib.
-
elise schrieb:
der linker linkt zusammen, und schimpft, wenn dann was fehlt. dir fehlt also eine lib.
Oh man ich muß noch viel lernen aber was genau fehlt mir jetzt was für ne lib und muß ich jetzt die cpp Datei auch includieren??????
Ich versteh gar nichts mehr
-
ich ging davon aus:
//queue.h template <class T> class Queue { public: Queue (); }; //queue.cpp #include "queue.h" template <class T> Queue<T>::Queue () {} //main.cpp #include "queue.h" class Event {}; int main () { Queue<Event> event_queue; }
das geht nicht so einfach, vor allem nicht mit den meisten aktuellen compilern.
lösung: verlagere queue.cpp in queue.h (d.h.//queue.h template <class T> class Queue { public: Queue (); }; template <class T> Queue<T>::Queue () {} //main.cpp #include "queue.h" class Event {}; int main () { Queue<Event> event_queue; }
) oder - wenn du die implementierung in einer extra datei haben willst
//queue.inc //war queue.cpp //queue.h class Queue { /*...*/ }; #include "queue.inc" //main.cpp unverändert
oder warte bis dein compiler export unterstützt.
-
Danke des sieht schon mal sehr brauchbar aus also versteh ich das jetzt richtig ich muß meine Queue.cpp in Queue.inc umbenennen!?
-
Die Endung ist im Prinzip völlig egal. Wichtig ist, dass template-Definitionen irgendwo über beliebig viele Ecken in jeder Datei, in der sie benutzt werden, inkludiert werden. .cpp nennt man sie nicht, weil sie zum Inkludieren und eben nicht zum einzelnen Kompilieren gedacht sind. Du kannst auch Queue.h und Queue_impl.h draus machen, oder eben alles in Queue.h schreiben (was ich persönlich am angenehmsten finde, da man dann die gesamte Klasse inline schreiben kann
).
-
Ok vielen Dank so weit aber ich komme schon mit der nächsten "blöden" Frage.
Das hat jetzt alles soweit geklappt aber jetzt gehts weiter:template <class T> class Queue { public: Queue(); ~Queue(); void add(T&); int remove(); int front(T&); int length(); int empty() const{return endeWarteSchlange == 0;} //liefert 1 zurück wenn die Schlange leer ist sonst 0 private: Event* endeWarteSchlange; };
das ist meine header Datei so im Konstruktor initialisiere ich jetzt "endeWarteSchlange" mit 0
template <class T> Queue<T>::Queue() { endeWarteSchlange = 0; }
soweit so gut.
Der nächste Aufruf ist dann length():template<class T> int Queue<T>::length() { if (endeWarteSchlange == 0) return 0; else { T* search = endeWarteSchlange->next; int zaehler = 1; while(search != endeWarteSchlange) { search = search->next; zaehler++; } return zaehler; }
So hier ignoriert er jetzt aber alles was da steht er springt direkt zu return zaehler und gibt ein sch... zurück aber dass er bei der if Anweisung eigentlich return 0 zurückgeben sollte interesiert den gar nicht.
Im Debugger heißts dann:Can not access Memory at address 0x0.
Aber das ging bei mir doch sonst auch immer wenn ich einen Nullzeiger hatte!!!
Kann mir jemand sagen wo das Problem liegt?????