"In function ... undefined reference to ..."
-
Guten Abend zusammen,
Nach einiger Abwesenheit von C++ möchte ich nun wieder einmal etwas darin machen. Es hat eigentlich prima angefangen, aber jetzt komme ich einfach nicht weiter.
Ich bekomme beim Kompilieren folgende Fehlermeldung:g++ src/Mainloop.o src/main.o -o overgame -ldl -llua -Llua/lua/src -Ilua/lua/src -lSDL -lSDLmain -ISDL/include -LSDL/build/.libs src/Mainloop.o: In function `Mainloop::update()': Mainloop.cpp:(.text+0x193): undefined reference to `LogicLoopable::update()' src/Mainloop.o: In function `Mainloop::draw()': Mainloop.cpp:(.text+0x1b2): undefined reference to `GraphicLoopable::draw()' collect2: Fehler: ld gab 1 als Ende-Status zurück
Bin jedoch auch nach langem Googlen (sitze schon seit Stunden an diesem Problem) nicht weitergekommen... Was zum Henker habe ich übersehen?
Vielen Dank schon im Voraus!// Loopable.hpp #ifndef _LOOPABLE_HPP #define _LOOPABLE_HPP #ifdef DREAMCAST #include <kos.h> #endif enum LoopableType { LOGIC, GRAPHIC, LOGIC_GRAPHIC }; class Loopable { public: const LoopableType loopableType; virtual ~Loopable(){} }; class LogicLoopable : public Loopable { public: void update(); virtual ~LogicLoopable(){} }; class GraphicLoopable : public Loopable { public: void draw(); virtual ~GraphicLoopable(){} }; #endif /* _LOOPABLE_HPP */
// Mainloop.hpp #ifndef _MAINLOOP_HPP #define _MAINLOOP_HPP #ifdef DREAMCAST #include <kos.h> #endif #include <SDL.h> #include <vector> #include "Loopable.hpp" class Loopable; class GraphicLoopable; class LogicLoopable; class Mainloop { public: Mainloop(); ~Mainloop(); int registerLoopable(Loopable* loopable); void deregisterLoopable(int id); void switchLoopable(int id); private: LogicLoopable *activeLogicLoopable; GraphicLoopable *activeGraphicLoopable; std::vector<Loopable*> loopables; void update(); void draw(); int oldticks, t, dt; int since(); void runCircles(); }; #endif /* _MAINLOOP_HPP */
// Mainloop.cpp #include "Mainloop.hpp" #include "Loopable.hpp" Mainloop::Mainloop() { oldticks = SDL_GetTicks(); dt = 10; t = 0; } int Mainloop::registerLoopable(Loopable* loopable) { loopables.push_back(loopable); return loopables.size() - 1; } void Mainloop::deregisterLoopable(int id) { loopables.erase(loopables.begin()+id); } void Mainloop::switchLoopable(int id) { Loopable* candidate = loopables.at(id); LoopableType t = candidate->loopableType; if(t == LOGIC) { activeLogicLoopable = (LogicLoopable*) candidate; } else if(t == GRAPHIC) { activeGraphicLoopable = (GraphicLoopable*) candidate; } else { activeLogicLoopable = (LogicLoopable*) candidate; activeGraphicLoopable = (GraphicLoopable*) candidate; } } void Mainloop::update() { activeLogicLoopable->update(); } void Mainloop::draw() { activeGraphicLoopable->draw(); } int Mainloop::since() { int newticks = SDL_GetTicks(); int ticks = newticks - oldticks; oldticks = newticks; return ticks; } void Mainloop::runCircles() { while(true) { t += since(); for(int i=0;i<t/dt;i++) { update(); } if(t/dt > 0) { draw(); t %= dt; } } }
-
Du solltest wohl die Methoden LogicLoopable::update() und GraphicLoopable::draw() definieren.
-
Es reicht also nicht, dass diese in der .hpp-Datei sind?
Das soll nämlich bloss ein Interface sein.
-
zilti schrieb:
Es reicht also nicht, dass diese in der .hpp-Datei sind?
Das soll nämlich bloss ein Interface sein.Doch, aber sobald Du sie irgendwo benutzt, muss sie auch schließlich definiert sein.
-
d.h. ich muss dieses "interface" dummy-mässig implementieren, damit es implementiert ist?
void update(){}
Korrekt?
-
Versuchs?
-
Funktioniert nicht. Auch eine implementation
void LogicLoopable::update(){}
funktioniert nicht.
Wenn ich mir meinen alten Code anschaue funktionierte dort mysteriöserweise sinngemässvirtual void update() = 0;
Das bringt hier aber auch nichts.
-
Welche Fehlermeldung kommt denn?
-
Diese hier:
zilti schrieb:
g++ src/Mainloop.o src/main.o -o overgame -ldl -llua -Llua/lua/src -Ilua/lua/src -lSDL -lSDLmain -ISDL/include -LSDL/build/.libs src/Mainloop.o: In function `Mainloop::update()': Mainloop.cpp:(.text+0x193): undefined reference to `LogicLoopable::update()' src/Mainloop.o: In function `Mainloop::draw()': Mainloop.cpp:(.text+0x1b2): undefined reference to `GraphicLoopable::draw()' collect2: Fehler: ld gab 1 als Ende-Status zurück
-
zilti schrieb:
Diese hier:
zilti schrieb:
g++ src/Mainloop.o src/main.o -o overgame -ldl -llua -Llua/lua/src -Ilua/lua/src -lSDL -lSDLmain -ISDL/include -LSDL/build/.libs src/Mainloop.o: In function `Mainloop::update()': Mainloop.cpp:(.text+0x193): undefined reference to `LogicLoopable::update()' src/Mainloop.o: In function `Mainloop::draw()': Mainloop.cpp:(.text+0x1b2): undefined reference to `GraphicLoopable::draw()' collect2: Fehler: ld gab 1 als Ende-Status zurück
Und die beiden Objectfiles hast du auch neu gebaut?
-
Phew, nach einem "make clean" hat das mit den virtuals tatsächlich funktioniert....
EDIT: Gerade gesehen, dass du auf die selbe Idee gekommen bist
Vielen dank nochmal für die Hilfe.
Ich brauche ne Gummiente hier auf dem Tisch...