SDL2 Fehler beim übergeben eines SDL_Window in einen anderen namespace



  • Guten Tag,

    ich habe zwei namespace's :
    Window.cpp

    #include "Window.h"
    
    namespace Window
    {
    	void  CreateWindow()
    	{
    		SDL_Window* window = SDL_CreateWindow(die Werte);
    	}
    }
    

    Window.h:

     #pragma once
    
    #include <SDL.h>
    
    namespace Window
    {
    	extern SDL_Window* window;
    
    	void CreateWindow();
    }
    

    Und der zweite namespace:
    Renderer.cpp

    #include "Renderer.h"
    
    namespace Renderer
    {
    	void CreateRenderer()
    	{
    		SDL_Renderer* renderer = SDL_CreateRenderer(Window::window, die anderern Werte);
    
    	}
    }
    

    Renderer.h

    #pragma once
    
    #include "Window.h"
    
    #include <SDL.h>
    
    namespace Renderer
    {
    	extern SDL_Renderer* renderer;
    
    	void CreateRenderer();
    }
    

    Mein Problem ist nun dass in der Renderer.cpp das Window::window beim kompilieren nicht übergeben wird und ich den Linker Error:

    LNK2001	Nicht aufgelöstes externes Symbol ""struct SDL_Window * Window::window" (?window@Window@@3PEAUSDL_Window@@EA)" 
    

    in der Renderer.obj Datei erhalte.

    Ich konnte das Problem provisorisch lösen in dem ich den namespace Window in die Renderer.cpp eingefügt habe und das SDL_Window window definiert habe:

    namespace Window
    {
          SDL_Window* window;
    }
    

    Das ist allerdings keine Lösung auf dauer und wollte Fragen wie das Problem sonst noch zu lösen ist.

    PS: Es ist leider doch keine Lösung, da dass window in der Renderer.cpp keinen Wert hat. 😐

    Vielen Dank im Vorraus.
    MFG
    Der Lernende😉



  • Deine beiden globalen Variablen (auch wenn sie jeweils in einem separaten Namespace liegen) müssen nicht nur deklariert werden, sondern benötigen jeweils eine Definition, d.h. in den jeweiligen Sourcedateien solltest du diese definieren (was du ja auch schon geändert hast):

    // in Window.cpp
    namespace Window
    {
    	SDL_Window* window;
    }
    
    // in Renderer.cpp
    namespace Renderer
    {
    	SDL_Renderer* renderer;
    }
    

    Und warum diese Variablen nicht gesetzt sind, liegt an deinen fehlerhaften CreateWindow und CreateRenderer-Funktionen. Na, siehst du jetzt diese Fehler?



  • @th69
    Was ist an denen fehlerhaft?
    Falls du das meinst weil die als Rückgabetyp int haben dass liegt daran weil ich noch Code drunter habe was die SDL Funktion überwacht und jenachdem eine Rückgabe geschieht

    Wenn ich einen Breakpoint direkt nach der CreateWindow Funktion setze sieht man im Compiler dass das window erstellt wurde. Sobald er dann die CreateRenderer Funktion aufruft ist das window wieder auf NULL aber warum?

    Das:
    @th69 sagte in SDL2 Fehler beim übergeben eines SDL_Window in einen anderen namespace:

    // in Window.cpp
    namespace Window
    {
    	SDL_Window* window;
    }
    
    // in Renderer.cpp
    namespace Renderer
    {
    	SDL_Renderer* renderer;
    }
    

    ist ja das gleiche was ich gemeint hatte.
    Habe es jetzt an erste stelle in den namespace Window in der Window.cpp geschrieben.
    Ist allerdings kein Unterschied.
    (Zwar kommt kein Fehler, wie wenn ichs in die Renderer.cpp schreibe aber das Window::window hat in der Renderer.cpp trotzdem keinen Wert mehr)



  • Habe eine akzeptable Lösung gefunden:
    Ich rufe in der CreateWindow() Funktion nach der überprüfung die CreateRender() Funktion auf und übergebe direkt den Wert.
    Window.cpp

    #include "Window.h"
    
    namespace Window
    {
    	SDL_Window* window;
    
    	int CreateWindow()
    	{
    		SDL_Window* window = SDL_CreateWindow("Game Loader 0.2b", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN);
    		
    		if (window == NULL)
    			return -1;
    		else
    			{
                                  Renderer::CreateRenderer(window);
    			      return 0;
                            }
    	}
    }
    

    Bzw. kann man ja eine SetWindow()Funktion in den namespace Renderer tun in dem die das window auf ein zweites window übertragen wird.🤔

    Falls jemand trotzdem weis warum die CreateRenderer() Funktion den Wert nicht selbst holen kann, wäre ich für eine Erklärung dankbar. 🙂



  • namespace Window
    {
    	SDL_Window* window;
    
    	int CreateWindow()
    	{
    		SDL_Window* window = SDL_CreateWindow("Game Loader 0.2b", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN);
    		// ...
    	}
    }
    

    Du legst damit eine lokale Variable gleichen Namens in der Funktion an und daher bleibt die globale Variable unangetastet.