Problem mit Präprozessor-Direktiven
-
Guten Tag,
Ich war schon oft, als "Anonymer" hier, doch nun habe ich beschlossen, mich anzumelden, um nicht nur Hilfe zu bekommen, sondern auch anderen zu helfen.
Doch nun zu meinem Problem:
Ich habe ein Projekt mit mehreren [3] .cpp-Dateien, die ein und den selben Header benötigen [#include "Window.h"]. Damit keine Mehrfachdefinition auftritt, habe ich versucht den Header dementsprechend zu sichern mit:#ifndef WINDOW_H #define WINDOW_H HWND hwndMain; DWORD dwWndWidth; DWORD dwWndHeight; bool bRun; #endifTrotzdem bekomme ich die Fehlermeldungen:
Driver.obj : error LNK2005: "unsigned long dwWndHeight" (?dwWndHeight@@3KA) ist bereits in BspMap.obj definiert.
Driver.obj : error LNK2005: "bool bRun" (?bRun@@3_NA) ist bereits in BspMap.obj definiert.
Driver.obj : error LNK2005: "struct HWND__ * hwndMain" (?hwndMain@@3PAUHWND__@@A) ist bereits in BspMap.obj definiert.
Driver.obj : error LNK2005: "unsigned long dwWndWidth" (?dwWndWidth@@3KA) ist bereits in BspMap.obj definiert.
Window.obj : error LNK2005: "unsigned long dwWndHeight" (?dwWndHeight@@3KA) ist bereits in BspMap.obj definiert.
Window.obj : error LNK2005: "bool bRun" (?bRun@@3_NA) ist bereits in BspMap.obj definiert.
Window.obj : error LNK2005: "struct HWND__ * hwndMain" (?hwndMain@@3PAUHWND__@@A) ist bereits in BspMap.obj definiert.
Window.obj : error LNK2005: "unsigned long dwWndWidth" (?dwWndWidth@@3KA) ist bereits in BspMap.obj definiert.
D:\FallenAngel\Debug\FallenAngel.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.Ich benutze die Visual C++ 2005 Express Edition.
Habe auch schon das Projekt bereinigt und erneut versucht, ohne Erfolg.
Muss ich noch irgendetwas in den Projekteinstellungen ändern?
Vielen Dank für eure Hilfe.
-
Die include-Guards schützen nur vor mehrfachen Definitionen innerhalb EINER Übersetzungseinheit (CPP-File nach Präprozessor-Verarbeitung), nicht vor Problemen zwischen verschiedenen Übersetzungseinheiten (bevor der Code auch nur in die Nähe des Linkers kommt, sind die PP-Direktiven schon verarbeitet worden). Da hilft es nur, die Definitionen in genau einer CPP-Datei einzutragen - mit extern-Deklarationen im Header>
//Window.h #ifndef WINDOW_H #define WINDOW_H extern HWND hwndMain; extern DWORD dwWndWidth; extern DWORD dwWndHeight; extern bool bRun; #endif//Window.cpp #include "Window.h" HWND hwndMain; DWORD dwWndWidth; DWORD dwWndHeight; bool bRun;
-
Die Variablen als extern im Header deklarieren und in einer .cpp Datei die Variablen dann definieren.
-
Vielen Dank, ihr habt mir sehr geholfen.
Dann weiß ich jetzt auch, dass ich mich wohl mal genauer über den Linker- und Builderprozess informieren muss.