HWND extern - LNK2005 Error
-
Kann es sein, dass du die directx.cpp in dxgame.cpp per include einbindest (oder umgekehrt)?
-
Ja, warum? Ich habe nur gehört, dass es schlechter Codestil ist (und in Verzweiflung wird man ja bekanntlich skrupellos
) und nicht, dass es massive Fehler hervorrufen kann . Habe ich da mal wieder was falsch verstanden ( kommt öfter vor
)?Jedenfalls Vielen Dank, dass du mir hilfst,
Gruß,
LauritzG
-
c/cpp-Dateien per include einbinden ist böse, das sollte man nie tun. Den Grund hast du dir ja exemplarisch selbst geliefert.

Wenn directx.cpp kompiliert wird, steht die Implementation der Funktionen darin in der entsprechenden Objektdatei. Wenn DXGame.cpp kompiliert wird, passiert dasselbe. Nur dass hier der komplette Inhalt von directx.cpp auch nochmal per include eingefügt und somit mit kompiliert wird. Du hast also alle Implementationen doppelt. Das merkt der Linker und wird böse!

Wenn du Funktionen einer anderen cpp-Datei bekannt machen willst, dann mach das über den Header (und schütze ihn mit include guards oder #pragma once).
-
Sry, dass ich mich schon länger nicht mehr gemeldet habe. Ich habe diesen Post schon so weit vorbereitet (BuildLog in Textdatei kopieren, vom Programmier- aufs andere System ziehen), dass ich gedacht habe, ich hätte bereits geschrieben.

Für das, was bisher passierte, möchte ich mich schon jetzt einmal herzlich bedanken.

Und, wir haben auch den LNK2005 Error beseitigt.
Der kleine Haken an der Sache ist nur, dass mit dessen Verschwinden zwei andere Errors aufgetaucht sind:------ Build started: Project: DXGame, Configuration: Debug Win32 ------ Compiling... DXGame.cpp directx.cpp Generating Code... Linking... DXGame.obj : error LNK2001: unresolved external symbol "public: static struct HWND__ * directx::game_window" (?game_window@directx@@2PAUHWND__@@A) directx.obj : error LNK2001: unresolved external symbol "public: static struct HWND__ * directx::game_window" (?game_window@directx@@2PAUHWND__@@A) directx.obj : error LNK2019: unresolved external symbol _Direct3DCreate9@4 referenced in function "public: int __thiscall directx::init(void)" (?init@directx@@QAEHXZ) D:\Dokumente und Einstellungen\XSoft\Desktop\DXGame\Debug\DXGame.exe : fatal error LNK1120: 2 unresolved externals Build log was saved at "file://d:\Dokumente und Einstellungen\XSoft\Desktop\DXGame\Debug\BuildLog.htm" DXGame - 4 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Was hat das denn jetzt schon wieder zu bedeuten? Ich habe nun versucht, dieses HWND mit extern, #pragma once und einer Headerdatei einzubinden.Vielen Dank noch einmal im Voraus,
LauritzG
-
Hm, er findet die Implementation der Methode game_window (aus Klasse directx) nicht (in den beiden Dateien, in denen du sie aufrufst). Gibt's die denn auch wirklich? Oder hast du vielleicht nur den Prototyp notiert?
-
Ähm... ich dachte bisher, HWND wäre ein Datentyp, wurde ja in den Linker-Ausgaben auch als struct aufgeführt.
Ich habe das in diesem Stil gemacht:// directx.h HWND game_window; ...und dann:
// globvars.h ... extern HWND game_window;im Header.
Ist das so nicht richtig?

Gruß
LauritzG
-
Hmmm. Eigentlich ist HWND ja ein handle. Aber anscheinend scheint meine Deklaration in dieser Weise wohl richtig zu sein, denn es heißt auf msdn:
HWND hwnd;Daran wird es also wohl noch nicht liegen können. Ich habe mir das Wort unresolved von Google übersetzen lassen und ich bin auf folgendes gestoßen:
"ungelöst".Das hat mich stutzig gemacht. Vielleicht muss man das HWND ja in irgendeiner Weise initialisiert werden?
Als ich mich dann in die Suche bei msdn über LNK2001 gemacht habe, stieß ich darauf:
"Trying to access a static variable from outside the file in which it is declared can cause LNK2001. Functions declared with the static modifier by definition have file scope. Static variables have the same limitation."
Aha.
Das muss wohl bedeuten, dass dasdirectx.obj : error LNK2001: unresolved external symbol "public: [b]static[/b] struct HWND__ * directx::game_window" (?game_window@directx@@2PAUHWND__@@A)nicht extern verwendet werden darf. Weiter bringt mich das aber leider nicht.
msdn sagt zu LNK2019:
"A symbol is defined as static and then later referenced outside the file."
Ach.
Das bestätigt nur noch einmal das, was ich vorhin schlussfolgerte.
Das bedeutet wohl: Klasse globvars erzeugen, Headerfile-Lösung nicht möglich. Ich probiere es mal damit.Bis zum nächsten Post,
euer LauritzG
-
[ironie]War ich wieder schlau!!![/ironie].

Ich habe nun mir diese BuildLogs noch einmal angesehen und habe festgestellt, dass ein Linker-Error auftritt, der heißt:Error 1 error LNK2001: unresolved external symbol _Direct3DCreate9@4 directx.objUnd das hat mich stutzig gemacht. Interessant. Es geht wohl gar nicht mehr um mein so geliebtes HWND, sondern um die Funktion
Direct3dCreate9, die ebenfalls in dem File ist. und die lautet so://Zuerst die Definition des LPDIRECT3D9 (es ist besonders toll, diesen Zung..Fingerbrecher einhändig zu tippen (ohne Caps-Lock, //das ist ja nur was für Cheater ;-) )) im Headerfile directx.h LPDIRECT3D9 d3d;//Und dann d3d = Direct3DCreate9( D3D_SDK_VERSION);Ist daran irgendetwas falsch??? Die ganzen Methoden und Daten (D3D_SDK_VERSION & Co.) scheint er zu erkennen, mit "Go to Definition"
zeigt er mir das immer brav an.Schon mal vielen Dank im Voraus,
euer LauritzG
-
D3D9.lib eingebunden?
-
sri schrieb:
D3D9.lib eingebunden?
Jop, habe ich gemacht, bzw. ich habe das .lib-Verzeichnis (so ziemlich als Letztes, danach kommen nur noch die Webcam-Libs mit denen ich experimetiere) in die VC++-Directories gesetzt und die d3dx9.h eingebunden (aber da ist ja schon die d3d9 drin).
Danke,
LauritzG
-
Das lib-Verzeichnis nur angeben hilft nicht viel. Du musst dem Linker schon sagen, welche .libs er einbinden soll. Das geht entweder über die Projekteigenschaften - Linker - Eingabe oder direkt per
#pragma comment(lib, "d3d9.lib")
-
Vielen, Vielen, Vielen Dank, sri und _matze!!!
Es hat alles problemlos geklappt. Ich habe die d3d9 jetzt eingebunden, zwischendurch gab es noch mit etwas anderem Probleme,l das habe ich aber durch einbinden der d3dx9.lib hinbekommen. Danke!Ich finde dieses ehrenamtliche Engagement übriges ganz toll.

Es ist schließlich eure Zeit, die ihr dafür verwendet, anderen Leuten zu helfen.
Ich hoffe, irgendwann einmal auch etwas zu dieser Sache beitragen zu können.Nochmals Vielen Dank und ein schönes Wochenende,
euer LauritzG
