problem mit includeieren und linker



  • hi leute,

    in meinem orjekt gibt es eine main.cpp, eine namespace.h und eine gamestate.h/cpp.
    erst habe ich die main die namespace includieren lassen

    main.cpp

    //...
    #include "namespace.h"
    //...
    

    dann habe ich die gamesate.h dazu geschrieben, die die daten aus der namespace.h braucht und auch in die main includiert werden muss.
    also

    gamestate.h

    //...
    #include "namespace.h"
    //...
    

    main.cpp

    //...
    #include "gamestate.h"
    //...
    

    da gibt es aber 15 linker fehler, da er meint dass daten aus der namespace.h schon in main.obj definiert seien.

    hier mal ein auszug:

    Kompilieren...
    main.cpp
    Verknüpfen...
    main.obj : error LNK2005: "public: __thiscall window::window(void)" (??0window@@QAE@XZ) ist bereits in gamestate.obj definiert.
    main.obj : error LNK2005: "public: __thiscall window::window(enum irr::video::E_DRIVER_TYPE,class irr::core::dimension2d<int>)" (??0window@@QAE@W4E_DRIVER_TYPE@video@irr@@V?$dimension2d@H@core@3@@Z) ist bereits in gamestate.obj definiert.
    main.obj : error LNK2005: "public: __thiscall window::window(enum irr::video::E_DRIVER_TYPE,class irr::core::dimension2d<int>,class irr::core::string<wchar_t,class irr::core::irrAllocator<wchar_t> >)" (??0window@@QAE@W4E_DRIVER_TYPE@video@irr@@V?$dimension2d@H@core@3@V?$string@_WV?$irrAllocator@_W@core@irr@@@53@@Z) ist bereits in gamestate.obj definiert.
    

    danke für jede hilfe

    mfg freaker



  • schreib einfach als ersten befehl in die beiden header-dateien
    #pragma once

    und die fehler sollten verschwunden sein..
    hoffe ich konnte dir helfen

    mfg manixx



  • Da sagt dir die Meldung doch ganz klar, was der Fehler ist - die betroffenen Funktionen wurden sowohl beim Compilieren der main.cpp als auch bei der gamestate.cpp compiliert und jetzt liegen sie doppelt da und der Linker kann sich jetzt nicht entscheiden, welche Version die richtige ist.

    Die Lösung ist ganz einfach: In den Header "namespace.h" gehören nur die Deklarationen der Funktionen (Ausnahmen: du hast die Funktionen inline angelegt oder du verwendest Templates). Die zugehörigen Definitionen kommen in ein eigenes .CPP-File.

    Edit @manixx: Include-Guards helfen gegen Compiler-Fehler, aber nicht gegen Linker-Fehler 😉



  • @manixx: das mit der #pragma anweißung klappt leider nicht
    @CStoll: in der namespace.h ist nichts definiert sondern nur deklariert. so eine art zusammenfassung aller globelen variablen:

    //***********************************************************************************//
    #if !defined(__npc__h__)
    #define __npc_h__
    
    //***********************************************************************************//
    #include "window.h"
    #include "player.h"
    #include "trigger.h"
    #include "gui.h"
    
    //***********************************************************************************//
    namespace api
    {
    	trigger	trg;
    
    	// the main window for the application
    	window	wnd(video::EDT_OPENGL, core::dimension2d<s32>(1280, 1024), 32, true, false, false, trg, L"Bomberman v0.0");
    
    	player	pla(L"stefan", BLUE);
    
    	// the scenemanegr
    	manager		mng(wnd);
    	//the videodriver
    	driver		drv(wnd);
    	//the guienvironment
    	interface	inf(wnd);
    
    	gui_dev		dev(inf.acces());
    }
    
    //***********************************************************************************//
    #endif
    


  • Zeig lieber mal gamestat.h.

    greetz, Swordfish



  • freaker schrieb:

    @CStoll: in der namespace.h ist nichts definiert sondern nur deklariert. so eine art zusammenfassung aller globelen variablen:

    Schau dir doch mal den Unterschied zwischen "Deklaration" und "Definition" an und überdenk nochmal deine Aussage 😉 Das da drin sind Variablendefinitionen - und die sind an der Stelle falsch (Deklarationen wären "extern trigger trg;" etc).

    PS: Und außerdem betrifft das Problem nicht nur diesen einen Header, sondern auch alles, was er eingebunden hat (die drei angegebenen Fehlermeldungen beziehen sich auf die Ctoren der window-Klasse).



  • @CStoll: Falls sich dein PS auf mich bezieht, so habe ich gehofft, dass sein Fehlermuster in gamestat.h offensichtlich werden würde. Sein Fehler durch mehrfachdefinition war mir schon klar 😉

    greetz, Swordfish



  • Swordfish schrieb:

    @CStoll: Falls sich dein PS auf mich bezieht, so habe ich gehofft, dass sein Fehlermuster in gamestat.h offensichtlich werden würde. Sein Fehler durch mehrfachdefinition war mir schon klar 😉

    Nein, das bezog sich auch auf freaker.


Anmelden zum Antworten