Warum kommen diese Fehler?



  • Hallo

    Ich habe es nun meine Engine so umgeschrieben, wie es userland mit gesagt hatte. Doch nun treten vier Fehler auf, bei diesem Code:

    // Cube3DEngine.h
    //
    #ifndef CUBE3DENGINE_HPP
    #define CUBE3DENGINE_HPP
    
    #include <windows.h>
    #include "Cube3DEngineStructures.h"
    
    // create a namespace
    //
    namespace CE
    {
    	// create a class
    	//
    	class Cube3DEngine
    	{
    	public:
    
    		void Initialize(CE::Cube3DEngineProperties & props);
    		void SetWindowProperties(int WindowWidth, int WindowHeight, int WindowDepth);
    		HWND OpenWindow(HINSTANCE hInstance);
    		static __declspec(dllexport)LRESULT WINAPI MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
    
    	private:
    
    		int m_WindowWidth;
    		int m_WindowHeight;
    		int m_WindowDepth;
    
    	}; // end of the class
    
    	__declspec(dllexport)Cube3DEngine * CreateCube3DEngine(void)
    	{
    		return new Cube3DEngine();
    	}
    
    } // end of the namespace
    
    #endif
    
    // Cube3DEngine.cpp
    //
    #include "Cube3DEngine.h"
    
    //create a namespce
    //
    namespace CE
    {
    	void Cube3DEngine::Initialize(CE::Cube3DEngineProperties & props)
    	{
    		props.WindowWidth = m_WindowWidth;
    		props.WindowHeight = m_WindowHeight;
    		props.WindowDepth = m_WindowDepth;
    	}
    
    	void Cube3DEngine::SetWindowProperties(int WindowWidth, int WindowHeight, int WindowDepth)
    	{
    		m_WindowWidth = WindowWidth;
    		m_WindowHeight = WindowHeight;
    		m_WindowDepth = WindowDepth;
    	}
    
    	HWND Cube3DEngine::OpenWindow(HINSTANCE hInstance)
    	{
    		WNDCLASSEX wc;
    
    		wc.style			= CS_HREDRAW | CS_VREDRAW;
    		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)GetStockObject(BLACK_BRUSH);
    		wc.lpszMenuName		= NULL;
    		wc.lpszClassName	= TEXT ("Cube3DEngine");
    		wc.hIconSm			= LoadIcon (NULL, IDI_APPLICATION);
    
    		if (RegisterClassEx (&wc) == 0) return 0;
    
    		return CreateWindowEx (NULL, TEXT("Cube3DEngine"), "Cube3DEngine",
    							   WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    							   GetSystemMetrics(SM_CXSCREEN)/2 - 250,
    							   GetSystemMetrics(SM_CYSCREEN)/2 - 187,
    							   800, 600, NULL,
    							   NULL, hInstance, NULL);
    	}
    
    	LRESULT WINAPI Cube3DEngine::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;
    					} break;
    				default: break;
    				}
    			} break;
    
    		case WM_DESTROY:
    			{
    				PostQuitMessage (0);
    				return 0;
    			}
    		default: break;
    		}
    
    		return DefWindowProc(hwnd, msg, wParam, lParam);
    	}
    } // end of the namespace
    
    // main.h
    //
    #include <windows.h>
    #include <Cube3DEngine.h>
    #pragma comment(lib, "Cube3DEngine.lib")
    
    // create a class
    //
    class MyApplication : public CE::Cube3DEngine
    {
    public:
    
    	MyApplication();
    	virtual ~MyApplication();
    
    };
    
    // main.cpp
    //
    #include "main.h"
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
    	MSG msg;
    	HWND hwnd;
    	bool bDone = false;
    	CE::Cube3DEngine * pCubeEngine;
    	CE::Cube3DEngineProperties props;
    
    	pCubeEngine = CE::CreateCube3DEngine();
    	pCubeEngine->Initialize(props);
    	pCubeEngine->SetWindowProperties(800, 600, 32);
    	hwnd = pCubeEngine->OpenWindow(hInstance);
    
    	while (!bDone)
        {
            while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    
        delete pCubeEngine;
        return 0;
    }
    

    Und hier sind die vier Fehler, bei der Verwendung des Programm, main.cpp

    ------ Erstellen gestartet: Projekt: Cube3DEngineTest, Konfiguration: Debug Win32 ------
    Verknüpfen...
       Bibliothek "C:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\Cube3DEngineTest\Debug\Cube3DEngineTest.lib" und Objekt "C:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\Cube3DEngineTest\Debug\Cube3DEngineTest.exp" werden erstellt.
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: struct HWND__ * __thiscall CE::Cube3DEngine::OpenWindow(struct HINSTANCE__ *)" (?OpenWindow@Cube3DEngine@CE@@QAEPAUHWND__@@PAUHINSTANCE__@@@Z)" in Funktion "_WinMain@16".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall CE::Cube3DEngine::SetWindowProperties(int,int,int)" (?SetWindowProperties@Cube3DEngine@CE@@QAEXHHH@Z)" in Funktion "_WinMain@16".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall CE::Cube3DEngine::Initialize(struct CE::Cube3DEngineProperties &)" (?Initialize@Cube3DEngine@CE@@QAEXAAUCube3DEngineProperties@2@@Z)" in Funktion "_WinMain@16".
    C:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\Cube3DEngineTest\Debug\Cube3DEngineTest.exe : 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\Cube3DEngineTest\Cube3DEngineTest\Debug\BuildLog.htm" gespeichert.
    Cube3DEngineTest - 4 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    Ich habe bei den Projekteinstellungen die Includeverzeichnisse und Libverzeichnisse eingestellt.

    Kann mir jemand sagen, warum das die vier Fehler auftreten?

    Gruss Patrick



  • Pack das __declspec(dllexport) zwischen "class" und den Klassennamen.



  • Ich habe nun __declspec(dllexport) zwieschen "class" und dem Klassennamen eingefügt. Doch es entstehen immer noch dieselben Fehler.

    class __declspec(dllexport) Cube3DEngine
    ...
    ...
    ...
    
    __declspec(dllexport)Cube3DEngine * CreateCube3DEngine(void)
    {
    	return new Cube3DEngine();
    }
    

Anmelden zum Antworten