Nicht aufgelöstes externes Symbol
-
Hallo
Ich habe heute begonnen mit dem Programmmieren einer DLL. Doch nun habe ich scheinbar einen Fehler programmiert. Denn ich erhalte eine Fehlermeldung, dass ich drei "Nicht aufgelöste externe Symbole" habe. Hier ist der Code.
// Dark3DCubeEnginedll.h // // Definitions of the functions // #ifndef DARK_HPP #define DARK_HPP #include <windows.h> // create a namespace, called DCE // namespace DCE { // Create a class, called Dark3DCubeEngine // class Dark3DCubeEngine { public: __declspec(dllexport) Dark3DCubeEngine (); static __declspec(dllexport) void Initialize (const int WindowWidth, const int WindowHeight, const int WindowDepth); static __declspec(dllexport) HWND OpenWindow (HINSTANCE hInstance); static __declspec(dllexport) LRESULT WINAPI MsgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); private: static int m_WindowWidth; static int m_WindowHeight; static int m_WindowDepth; }; // End of the class } // End of the namespace #endif // Dark3DCubeEnginedll.cpp // // Definitions of the functions // #include "Dark3DCubeEnginedll.h" // Create a namespace, called DCE // namespace DCE { Dark3DCubeEngine::Dark3DCubeEngine() { m_WindowWidth = 0; m_WindowHeight = 0; m_WindowDepth = 0; } void Dark3DCubeEngine::Initialize(const int WindowWidth, const int WindowHeight, const int WindowDepth) { Dark3DCubeEngine::m_WindowWidth = WindowWidth; Dark3DCubeEngine::m_WindowHeight = WindowHeight; Dark3DCubeEngine::m_WindowDepth = WindowDepth; } HWND Dark3DCubeEngine::OpenWindow(HINSTANCE hInstance) { WNDCLASSEX wc; wc.cbSize = sizeof (wc); wc.lpfnWndProc = MsgProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT ("Dark3DCubeEngine"); wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION); if (RegisterClassEx (&wc) == 0) return 0; return CreateWindowEx (NULL, TEXT("Dark3DCubeEngine"), "Dark3DCubeEngine", WS_OVERLAPPEDWINDOW | WS_VISIBLE, GetSystemMetrics(SM_CXSCREEN)/2 - 250, GetSystemMetrics(SM_CYSCREEN)/2 - 187, m_WindowWidth, m_WindowHeight, NULL, NULL, hInstance, NULL); } LRESULT WINAPI Dark3DCubeEngine::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { // key was pressed // case WM_KEYDOWN: { switch (wParam) { case VK_ESCAPE: { PostMessage (hwnd, WM_CLOSE, 0, 0); return 0; } default: break; } } break; case WM_DESTROY: { PostQuitMessage (0); return 1; } default: break; } return DefWindowProc(hwnd, msg, wParam, lParam); } } // End of the namespaceHier ist die Fehlermeldung:
------ Erstellen gestartet: Projekt: Dark3DCubeEngine, Konfiguration: Debug Win32 ------ Kompilieren... Dark3DCubeEnginedll.cpp Manifest in Ressourcen wird kompiliert... Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1 Copyright (C) Microsoft Corporation. All rights reserved. Verknüpfen... Bibliothek "C:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\Dark3DCubeEngine\Debug\Dark3DCubeEngine.lib" und Objekt "C:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\Dark3DCubeEngine\Debug\Dark3DCubeEngine.exp" werden erstellt. Dark3DCubeEnginedll.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""private: static int DCE::Dark3DCubeEngine::m_WindowDepth" (?m_WindowDepth@Dark3DCubeEngine@DCE@@0HA)". Dark3DCubeEnginedll.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""private: static int DCE::Dark3DCubeEngine::m_WindowHeight" (?m_WindowHeight@Dark3DCubeEngine@DCE@@0HA)". Dark3DCubeEnginedll.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""private: static int DCE::Dark3DCubeEngine::m_WindowWidth" (?m_WindowWidth@Dark3DCubeEngine@DCE@@0HA)". C:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\Dark3DCubeEngine\Debug\Dark3DCubeEngine.dll : fatal error LNK1120: 3 nicht aufgelöste externe Verweise. Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\Dark3DCubeEngine\Debug\BuildLog.htm" gespeichert. Dark3DCubeEngine - 4 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Kann mir jemand sagen, was ich falsch programmiert habe?
Gruss Patrick
-
Das ist ja dein Header, oder?
Dort deklarierst du die Variable ja nur. Du musst sie nur noch in deiner Implementierungsdatei definieren (und u.U. Initialisieren). http://www.c-plusplus.net/forum/viewtopic-var-t-is-61231.html
D.h./// Dark3DCubeEnginedll.cpp // // Definitions of the functions // #include "Dark3DCubeEnginedll.h" // Create a namespace, called DCE // namespace DCE { static int Dark3DCubeEngine::m_WindowDepth; // = 0 static int Dark3DCubeEngine::m_WindowHeight; // = 0 static int Dark3DCubeEngine::m_WindowWidth; // = 0 Dark3DCubeEngine::Dark3DCubeEngine() { // ... } void Dark3DCubeEngine::Initialize(const int WindowWidth, const int WindowHeight, const int WindowDepth) { // ... } HWND Dark3DCubeEngine::OpenWindow(HINSTANCE hInstance) { // ... } LRESULT WINAPI Dark3DCubeEngine::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { // ... } } // End of the namespaceNoch viel Glück
-
Danke für deine Antwort
Nun habe ich bei der .cpp Datei den Code beigefügt. Die Header-Datei habe ich so gelassen. Die .cpp Datei sieht nun so aus:
// Dark3DCubeEnginedll.cpp // // Definitions of the functions // #include "Dark3DCubeEnginedll.h" // Create a namespace, called DCE // namespace DCE { static int Dark3DCubeEngine::m_WindowDepth; // = 0 static int Dark3DCubeEngine::m_WindowHeight; // = 0 static int Dark3DCubeEngine::m_WindowWidth; // = 0 void Dark3DCubeEngine::Initialize(const int WindowWidth, const int WindowHeight, const int WindowDepth) { m_WindowWidth = WindowWidth; m_WindowHeight = WindowHeight; m_WindowDepth = WindowDepth; } HWND Dark3DCubeEngine::OpenWindow(HINSTANCE hInstance) { WNDCLASSEX wc; wc.cbSize = sizeof (wc); wc.lpfnWndProc = MsgProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT ("Dark3DCubeEngine"); wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION); if (RegisterClassEx (&wc) == 0) return 0; return CreateWindowEx (NULL, TEXT("Dark3DCubeEngine"), "Dark3DCubeEngine", WS_OVERLAPPEDWINDOW | WS_VISIBLE, GetSystemMetrics(SM_CXSCREEN)/2 - 250, GetSystemMetrics(SM_CYSCREEN)/2 - 187, m_WindowWidth, m_WindowHeight, NULL, NULL, hInstance, NULL); } LRESULT WINAPI Dark3DCubeEngine::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { // key was pressed // case WM_KEYDOWN: { switch (wParam) { case VK_ESCAPE: { PostMessage (hwnd, WM_CLOSE, 0, 0); return 0; } default: break; } } break; case WM_DESTROY: { PostQuitMessage (0); return 1; } default: break; } return DefWindowProc(hwnd, msg, wParam, lParam); } } // End of the namespaceDoch jetzt gibt es noch folgende drei Fehlermeldungen:
Erstellen gestartet: Projekt: Dark3DCubeEngine, Konfiguration: Debug Win32 ------ Kompilieren... Dark3DCubeEnginedll.cpp c:\dokumente und einstellungen\patrick\eigene dateien\visual studio 2008\projects\dark3dcubeengine\dark3dcubeenginedll.cpp(11) : error C2720: 'DCE::Dark3DCubeEngine::m_WindowDepth': 'static ' Speicherklassenspezifizierer für Elemente unzulässig c:\dokumente und einstellungen\patrick\eigene dateien\visual studio 2008\projects\dark3dcubeengine\dark3dcubeenginedll.cpp(12) : error C2720: 'DCE::Dark3DCubeEngine::m_WindowHeight': 'static ' Speicherklassenspezifizierer für Elemente unzulässig c:\dokumente und einstellungen\patrick\eigene dateien\visual studio 2008\projects\dark3dcubeengine\dark3dcubeenginedll.cpp(13) : error C2720: 'DCE::Dark3DCubeEngine::m_WindowWidth': 'static ' Speicherklassenspezifizierer für Elemente unzulässig Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\Dark3DCubeEngine\Debug\BuildLog.htm" gespeichert. Dark3DCubeEngine - 3 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Weiss du was ich falsch programmiert habe?
Gruss Patrick
-
mach das static da weg das hat da nix verloren da droben