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 lassenmain.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.
alsogamestate.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 onceund die fehler sollten verschwunden sein..
hoffe ich konnte dir helfenmfg 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.