LNK2005 Beheben



  • Hi,
    ich benutze die olcPixelGameEngine. Dabei stoße ich soooo oft auf Linker Fehler. Kann mir jemand da weiterhelfen? Akut ist das problem, dass alles in der Header definiert wird.

    So sieht mein Programm aus:
    GameLogic.h:

    #pragma once
    #define OLC_PGE_APPLICATION
    #include "Food.h"
    #include "InputHandler.h"
    #include "olcPixelGameEngine.h"
    #include "Snake.h"
    #include "Screen.h"
    
    class GameLogic : public olc::PixelGameEngine
    {
    public:
    	//var
    	static int GameWidth, GameHeight;
    	static Snake* GameSnake;
    	static Food* GameFood;
    private:
    	Screen* GameScreen;
    	InputHandler* InputMapper;
    	//PGE
    	bool OnUserCreate() override;
    	bool OnUserUpdate(float fElapsedTime) override;
    	//Logic
    	bool EatFood(Position);
    	void MoveSnake();
    public:
    
    
    	GameLogic()
    	{
    		GameScreen = new Screen(this);
    		InputMapper = new InputHandler(this);
    		GameSnake = new Snake(Position{1, 1}, Position{0, 1});
    		GameFood = new Food;
    		GameFood->GenerateNewFood();
    		sAppName = "Snake";
    	}
    
    	~GameLogic() override
    	{
    		delete GameScreen;
    		delete InputMapper;
    	}
    };
    

    Wenn ich dann die Screen.h/.cpp benutze bekomme ich LNK2005 Fehler, da wohl die olcPixelGameEngine.h mehrfach eingebunden wird.
    Screen.h:

    #pragma once
    #include "EngineExtension.h"
    
    
    namespace olc {
    	struct Pixel;
    }
    
    class GameLogic;
    
    class Screen : public EngineExtension
    {
    	void PaintCircle(int,int,olc::Pixel);
    public:
    	void PaintScreen();
    	void PaintSnake();
    	using EngineExtension::EngineExtension;
    };
    

    Screen.cpp:

    #include "Screen.h"
    #include "GameLogic.h"
    #include "olcPixelGameEngine.h"
    #include "Position.h"
    
    void Screen::PaintCircle(int x, int y, olc::Pixel color)
    {
    	int circleWidth = Engine->ScreenWidth() / GameLogic::GameWidth;
    	Engine->FillCircle(x * circleWidth + circleWidth / 2, y * circleWidth + circleWidth / 2, circleWidth / 2, color);
    }
    
    void Screen::PaintScreen()
    {
    	Engine->Clear(olc::DARK_BLUE);
    	for (int x = 0; x < GameLogic::GameWidth; x++)
    		for (int y = 0; y < GameLogic::GameHeight; y++)
    			PaintCircle(x, y, olc::BLACK);
    	PaintCircle(GameLogic::GameFood->x, GameLogic::GameFood->y, olc::GREY);
    }
    
    void Screen::PaintSnake()
    {
    	Position snakeElement = GameLogic::GameSnake->GetNthElement(0);
    	PaintCircle(snakeElement.x, snakeElement.y, olc::RED);
    	for (int i = 1; i < GameLogic::GameSnake->GetLenght(); i++)
    	{
    		snakeElement = GameLogic::GameSnake->GetNthElement(i);
    		PaintCircle(snakeElement.x, snakeElement.y, olc::YELLOW);
    	}
    }
    

    EngineExtension.h:

    #pragma once
    
    class GameLogic;
    
    class EngineExtension
    {
    public:
    	GameLogic* Engine;
    	EngineExtension(GameLogic* engine) { Engine = engine; }
    };
    

    Das Akute Problem ist nun, wenn ich die GameLogic.h mehrfach includiere, dass dann gemeckert wird, dass die Funktionen der OlcPixelGameEngine mehrfach definiert sind. Wie löse ich am besten das Problem, dass das nicht mehr dazu kommt? In den .cpp Dateien erlaubt die IDE keine Forward Deklarationen. Zumindest nicht in der Screen.h Denn meine vermutung wäre, dass ich das Include durch ein Forward Deklaration austausche. Geht aber leider nicht.

    Wie verhindere ich die mehrfachdeklaration mit der Library?



  • Wofür die Forward Declaration von GameLogic in Screen.h, die wird dort nirgens benötigt?



  • @axels Blieb noch übrig, geht aber eher um das hauptproblem 😭



  • Dann poste doch bitte mal die komplette Fehlermeldung. Ich vermute was ganz anderes...



  • @DocShoe Es sind 170

    Severity	Code	Description	Project	File	Line	Suppression State
    Error	LNK2005	"public: __thiscall olc::Decal::Decal(unsigned int,class olc::Sprite *)" (??0Decal@olc@@QAE@IPAVSprite@1@@Z) already defined in GameLogic.obj	Snake	C:\Users\games\source\repos\Snake\Screen.obj	1
    
    Severity	Code	Description	Project	File	Line	Suppression State
    Error	LNK2005	"public: __thiscall olc::Pixel::Pixel(unsigned char,unsigned char,unsigned char,unsigned char)" (??0Pixel@olc@@QAE@EEEE@Z) already defined in GameLogic.obj	Snake	C:\Users\games\source\repos\Snake\Screen.obj	1	
    
    


  • @Gamestarplayer41 sagte in LNK2005 Beheben:

    namespace olc {
    struct Pixel;
    }

    Warum das? Ich wette das ist es was dir um die Ohren fliegt!



  • @axels Also in der Screen.h kann ich entweder entscheiden, ob ich #include "olcPixelGameEngine.h" mache oder das forward deklariere. Letzteres scheint mir die bessere option tbh



  • @Gamestarplayer41

    Lies dir mal den Kommentar in PixelEngine.h ab Zeile 1088 durch.



  • Es geht dabei bestimmt nicht um Include Reihenfolgen.

    Die zweite Fehlermeldung die du gepostet hast sagt mir, dass die Klasse Pixel mehrfach definiert ist, da du meinst in einem dir nicht durchdrungenen Namespace selbst Klassen zu definieren. Das geht meist mit 1000 prozentiger Wahrscheinlichkeit schief.



  • @DocShoe Ah danke, warum das mitten in der Header ist frag ich mich, aber egal...

    Nun stellt sich das (hoffentlich) letzte Problem. Also ich habe in der GameLogic.cpp die 2 zeilen eingefügt und in der Header rausgenommen. (Hoffentlich richtig, dort steht ja olcPixelGameEngine.cpp, aber das meint vermutlich die baseKlasse in meinem fall GameLogic oder?). Dann kommen folgende Fehler:

    C2039,C2504,C2065, C2039

    Severity	Code	Description	Project	File	Line	Suppression State
    Error	C2039	'PixelGameEngine': is not a member of 'olc'	Snake	C:\Users\games\source\repos\Snake\GameLogic.h	7
    

    Denke mal alle sind vom gleichen Problem Abhängig.
    Verstehen warum das so ist tue ich leider nicht



  • @axels Wo hab ich im olc Namespace was selbst definiert? Ich habe doch nur Forward deklariert?



  • @Gamestarplayer41 Du darfst OLC_PGE_APPLICATION nur in einem .cpp File definieren.
    Lösch die Definition aus dem Header-File raus und mach sie statt dessen in eines deiner .cpp Files rein.


Anmelden zum Antworten