Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.11.2006, 14:41

Linkerfehler 2001

hi,
will euch nicht jetzt nicht schon wieder mit LNK2001 nerven,
ich habe aber schon die forum suche und Google benutzt und habe keine Lösung gefunden.
Also,
beim Kompilieren des Beispielprogramms 2.4.7 bekomme ich immer diesen Fehler:

Quellcode

1
error LNK2001: Nicht aufgelöstes externes Symbol ""struct HWND__ * g_hWindow" (?g_hWindow@@3PAUHWND__@@A)".


Weiß nicht welche Lib ich vergessen haben könnte.

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

2

26.11.2006, 16:44

und du bist dir sicher, das nirgendwo in deinem Code sowas wie

C-/C++-Quelltext

1
extern HWND g_hWindow;
steht ? :)
"Have you tried turning it off and on again?"

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

26.11.2006, 17:08

und hast du auch alle .cpp dateien zu deinem projekt hinzugefügt?

4

26.11.2006, 17:32

Die Dateien sind alle im Projekt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#ifdef _INITWINDOW_CPP
#undef VAR
#define VAR
#else
#undef VAR
#define VAR extern
#endif


// ******************************************************************

// Variablen

VAR HWND g_hWindow;

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

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

26.11.2006, 19:53

Wird auch in dem Zusammenhang irgendwo _INITWINDOW_CPP definiert? (ich find die Lösung irgendwie voll dirty^^)

DigitalDream

Frischling

Beiträge: 66

Beruf: Entwickler

  • Private Nachricht senden

6

26.11.2006, 20:03

Lad mal Dein Beispiel neu von der CD ...
Ich kann mir nämlich speziell bei dieser Meldung nicht vorstellen,dass du nichts geändert hast ...

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

7

27.11.2006, 12:24

Zitat von »"Keinhacker"«

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.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

8

27.11.2006, 15:41

Thx für die Antworten.
Ich habe mal das Projekt von der CD kopiert und kompiliert.
Funktioniert jetzt, was ich anders gemacht habe ich aber nicht gefunden.

Werbeanzeige