Die Dateien sind alle im Projekt.
Das steht in der Datei InitWindow.h die vor der Tribase Engine benutzt wird und von David geschrieben ist.
Ohne Extern komm auch ein Fehler
Hier muss man bedenken, was eigentlich passieren soll.
Wenn ein extern vor der Variablen steht, bedeutet das eigentlich nur, dass man dem Compiler sagt, den Namen "g_hWindow" gibt es irgendwo, und der darf benutzt werden. Wo die Definition herkommt, wird erst beim Linker entschieden.
Wenn man das extern weglässt, wird der Name nicht nur deklariert, sondern auch definiert (also man sagt, hier soll er stehen).
Nun ist InitWindow.h aber ein Header, der an verschiedenen Stellen benutzt werden darf. Wenn man also nicht aufpasst, kann es einem passieren, dass g_hWindow mehrfach definiert wird, darum wird meistens nur deklariert (als extern davor geschrieben). Wenn man also niemals extern davor schreibt, und den Header in verschiedenen .cpp Dateien benutzt bekommt man einen Linker Fehler, dass ein Symbol mehrfach definiert ist.
Darum wird das gesteuert durch die Präprozessor Definition von _INITWINDOW_CPP. Nur wenn dieses Symbol definiert ist, darf g_hWindow auch definiert werden, in allen anderen Fällen darf der Name nur deklariert werden. Ausgenutzt wird das dann so:
|
C-/C++-Quelltext
|
1
2
3
4
|
// init_window.cpp
#define _INITWINDOW_CPP
#include "InitWindow.h"
|
Die Datei init_window.cpp ist dann die einzige Datei, die das Symbol _INITWINDOW_CPP definiert, so dass g_hWindow nur genau dort einmal definiert wird. Kann sein, dass die Datei auch anders heisst, aber es gibt genau eine Datei, in der das Symbol definiert wird.
Wenn du also diese Datei nicht in deinem Projekt hast, kann der Linker hinterher keine Definition von g_hWindow mehr finden, obwohl der Name für den Compiler immer deklariert war. Die Lösung wäre dann, entweder diese Datei zu deinem Projekt hinzuzufügen, oder in einer einzigen Datei, die InitWindow.h einbindet, eben dieses Symbol zu definieren.
Gruss,
Rainer
PS: es ist immer wichtig, zwischen Deklaration (ich habe Schnaps dabei) und Definition (die Flasche ist im Koffer) zu unterscheiden. Zum Compilieren braucht man nur eine Deklaration zum Linken genau eine Definition.