"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äss

    virtual 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...


Log in to reply