undefined reference in eigener klasse





  • danke



  • verssuch es mal mit makefiles

    hier mal nen Beispiel:

    CC = g++
    OBJ = main.o coordinate.o
    APP = Programmname
    
    all: $(OBJ)
    	$(CC) -o $(APP) $(OBJ)
    
    .cpp.o:
    	$(CC) -c $<
    
    clean:
    	rm -rf $(OBJ) $(APP)
    
    main.o: main.cc coordinate.h
    coordinate.o: coordinate.cc coordinate.h
    

    Die funktionsweise dieser makefiles ist einfach:

    einfach make eingeben und das was unter all: steht wird ausgeführt.
    In den Ersten drei Zeilen sind Variablen definiert, die dann Später mit $(Variablenname) aufgerufen werden. Funktioniert änlich wie ein Makros in C++. Wichtig alles was hier steht miss in eine Datei namens "Makefile"

    Dies Makefile hat man mir hal geschrieben, als ich nach der Funktionsweise von Makefiles nachgefragt habe.

    CC = g++
    OBJ = main.o modul1.o modul2.o
    APP = programmname
    CFLAGS = $(shell sdl-config --cflags) # evtl auch noch -O2 für Optimierungen, oder -Wall für Warnungen
    LDFLAGS = -lm $(shell sdl-config --libs)
    
    # das hauptziel (die syntax ist immer: "ziel: abhängigkeiten\n\tbefehle", also unbediengt mit dem tab einrücken...)
    all: $(OBJ)
       $(CC) $(LDFLAGS) -o $(APP) $(OBJ)
    
    # generelle Regel zum Erzeugen von Objektdateien (.o) aus dem Quellcode (.cpp)
    .cpp.o:
       $(CC) $(CFLAGS) -c $<
    
    # das ist ganz nützlich zum Aufräumen ;)
    clean:
       rm -rf $(OBJ) $(APP)
    
    # zusätzliche Abhängigkeiten (da make nun schon weiß, wie es aus einer .cpp
    # datei zu einer .o Datei kommt, reichen hier einfach die Dateien von denen das
    # Modul abhängt. Wenn du dann z.B. eine Headerdatei änderst, dann wird das
    # entsprechende Objektfile automatisch neu kompiliert und dann wieder zu dem
    # Programm gelinkt.
    main.o: main.cpp common.h
    modul1.o: modul1.cpp modul1.h common.h
    modul2.o: modul2.cpp modul2.h
    

    Da ist noch SDL und so drin, könntest du auch mal gebrauchen.

    So wird übrigens nicht mehr alles neu kompiliert, sondern nur der Teil, an dem Änderungen gemacht wurden. (Beschleunigt das Kompilieren bei größeren Projeten)



  • Krux schrieb:

    verssuch es mal mit makefiles

    In welchem Bezug steht dieser Tipp jetzt zu dem geäusserten Problem und seiner (vollkommen richtigen) Lösung?



  • @krux: das mit den makefiles hab ich schon raus. ich hatte die klasse erst mit int statt als template geschrieben und da hatte ja alles funktioniert.
    da mir DEvent gesagt hat, was zu machen ist funktioniert alles wieder einwandfrei, auch wenn es etwas unschön is meiner ansicht nach.



  • hmm ich habe jetzt eine klasse, die von einer kronkretisierung eines templates erbt. gilt das da auch noch? bei mir funktioniert das anders mit header und source irgendwie nicht.
    etwa so:

    class Abgeleitet : public TemplateBasisKlass<int>
    {
       //fancy stuff here
    }
    

    bin ich einfach zu blöd oder geht das nicht?



  • Beschreib doch mal den Fehler genauer. Denn das sollte schon gehen.



  • ja selber fehler wie oben: "undefinede refernce"

    //vrentity.h
    
    #include "entity.h"
    #include "vector.h"
    
    namespace VR
    {
    
    	enum Acceleration { KEEP, RIGHT, UP, DOWN, LEFT};
    
    	class VREntity : protected Entity<int>
    	{
    		public:
    			VREntity();
    			VREntity(int initX, int initY, int initXSpeed, int initYSpeed);
    			VREntity(Vector<int> initPosition, Vector<int> initSpeed);
    			~VREntity();
    
    			Vector<int> step(Acceleration acc);
    
    			using Entity<int>::getPosition;
    			using Entity<int>::getSpeed;
    	};
    
    /*	VREntity::VREntity()
    	{
    		position = Vector<int>(0,0);
    		speed = Vector<int>(0,0);
    	}
    
    	VREntity::VREntity(int initX, int initY, int initXSpeed, int initYSpeed)
    	{
    		position = Vector<int>(initX,initY);
    		speed = Vector<int>(initXSpeed,initYSpeed);
    	}
    
    	VREntity::VREntity(Vector<int> initPosition, Vector<int> initSpeed)
    	{
    		position = initPosition;
    		speed = initSpeed;
    	}
    
    	VREntity::~VREntity()
    	{
    	}
    
    	Vector<int> VREntity::step(Acceleration acc)
    	{
    		switch (acc)
    		{
    			case KEEP	: break;
    			case RIGHT	: accelerate(Vector<int>(1, 0)); break;
    			case UP		: accelerate(Vector<int>(0, 1)); break;
    			case LEFT	: accelerate(Vector<int>(-1, 0)); break;
    			case DOWN	: accelerate(Vector<int>(0, -1));
    		}
    
    		move();
    
    		return position;
    	}*/
    }
    
    #include "../include/vrentity.h"
    
    namespace VR
    {
    
    	VREntity::VREntity()
    	{
    		position = Vector<int>(0,0);
    		speed = Vector<int>(0,0);
    	}
    
    	VREntity::VREntity(int initX, int initY, int initXSpeed, int initYSpeed)
    	{
    		position = Vector<int>(initX,initY);
    		speed = Vector<int>(initXSpeed,initYSpeed);
    	}
    
    	VREntity::VREntity(Vector<int> initPosition, Vector<int> initSpeed)
    	{
    		position = initPosition;
    		speed = initSpeed;
    	}
    
    	VREntity::~VREntity()
    	{
    	}
    
    	Vector<int> VREntity::step(Acceleration acc)
    	{
    		switch (acc)
    		{
    			case KEEP	: break;
    			case RIGHT	: accelerate(Vector<int>(1, 0)); break;
    			case UP		: accelerate(Vector<int>(1, 0)); break;
    			case LEFT	: accelerate(Vector<int>(-1, 0)); break;
    			case DOWN	: accelerate(Vector<int>(0, -1));
    		}
    
    		move();
    
    		return position;
    	}
    }
    
    //main.cc
    #include <iostream>
    #include "../include/vrentity.h"
    #include "../include/vector.h"
    #include "../include/fair_container.h"
    int main()
    {
    	VR::VREntity a(0, 0, 1, 1);
    
    	std::cout << a.getPosition()[0] << ' ' << a.getPosition()[1] << std::endl;
    
    	a.step(VR::UP);
    
    	std::cout << a.getPosition()[0] << ' ' << a.getPosition()[1] << std::endl;
    
    	a.step(VR::RIGHT);
    
    	std::cout << a.getPosition()[0] << ' ' << a.getPosition()[1] << std::endl;
    
    	return 0;
    }
    
    /bin/sh ../libtool --tag=CXX --mode=link g++ -Wall -g -g -O2   -o vectorrace  main.o SDLGraphics.o -lSDL 
    g++ -Wall -g -g -O2 -o vectorrace main.o SDLGraphics.o  /usr/lib/libSDL.so
    main.o: In function `main':/home/mambokurt/Projects/VectorRace/src/main.cc:10: undefined reference to `VR::VREntity::VREntity(int, int, int, int)'
    :/home/mambokurt/Projects/VectorRace/src/main.cc:14: undefined reference to `VR::VREntity::step(VR::Acceleration)'
    :/home/mambokurt/Projects/VectorRace/src/main.cc:18: undefined reference to `VR::VREntity::step(VR::Acceleration)'
    :/home/mambokurt/Projects/VectorRace/src/main.cc:24: undefined reference to `VR::VREntity::~VREntity()'
    :/home/mambokurt/Projects/VectorRace/src/main.cc:24: undefined reference to `VR::VREntity::~VREntity()'
    collect2: ld returned 1 exit status
    make: *** [vectorrace] Error 1
    

    wenn ich alles in den header schreibe, also die auskommentierung weg lasse, funktioniert alles.



  • Gehoert die Implementationsdatei zum Projekt? Wird sie also kompilliert?



  • ja sie gehört zum projekt und wird kompiliert. hab auch schon mal "vo hand" kompiliert und versucht zu linken. hat auch zu keinem erfolg geführt


Anmelden zum Antworten