[GELÖST]DirectX "nicht aufgelöstes externes Symbol"



  • Nabend,
    folgendes Problem. Ich spiele gerad mit DirectX herum und möchte einen kleinen Teapot rendern, ohne großen Aufwand. Sollte ja eigentlich kein Problem sein, aber VC++ meldet mir einfach einen blöden Fehler bei meiner eignene Funktion. Hier die einzelnen Dateien:

    BasicD3DHeader.h

    #include <d3d9.h>
    #include <d3dx9.h>
    
    #define SAFE_RELEASE(x) if (x != NULL) {x->Release(); x = NULL;}
    #define SCREEN_WIDTH 1280
    #define SCREEN_HEIGHT 1024
    
    #pragma comment(lib, "d3d9.lib")
    #pragma comment(lib, "d3dx9.lib")
    
    class BasicD3D
    {
    private:
    
    	LPDIRECT3DDEVICE9 m_D3DDevice;
    	LPDIRECT3D9 m_pD3D;
    	LPD3DXMESH m_D3DMesh;
    
    public:
    
    	//Konstruktor
    	BasicD3D();
    
    	//Basic Funktionen
    	void BeginScene (void);
    	void EndScene (void);
    	void CleanUpD3D (void);
    	void InitD3D(HWND hwnd);
    
    	//Graphics
    	void RenderAct (void);
    };
    
    HWND CreateMainWindow(HINSTANCE hInstance);
    

    BasicD3DHeader.cpp

    #include "BasicD3DHeader.h"
    
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
        WNDCLASSEX wndClass =
        {
            sizeof(WNDCLASSEX),                                 // Größe angeben
            CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile
            DefWindowProc,                                     // Callback-Funktion
            0,                                                  // Zusätzliche Angaben
            0,                                                  // nicht benötigt
            hInstance,                                          // Anwendungsinstanz
            LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
            LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
            (HBRUSH)GetStockObject(BLACK_BRUSH),                // Weißer Pinsel
            NULL,                                               // kein Menü
            "WindowClass",                                      // Der Name der Klasse
            LoadIcon(NULL, IDI_WINLOGO)                         // Windows Logo
        };
    
        RegisterClassEx(&wndClass);
    
        return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                              "WindowClass",          // Klassenname
                              "DX Test",     // Fenstertitel
                              WS_OVERLAPPEDWINDOW |   // Fenster
                              WS_VISIBLE,             // Eigenschaften
                              0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,         // Anfangsposition und Größe
                              NULL,                   // Handle des Elternfensters
                              NULL,                   // Handle des Menüs
                              hInstance,              // Anwendungsinstanz
                              NULL);                  // wird nicht benötigt
    }
    
    void BasicD3D::InitD3D(HWND hwnd)
    {
    	D3DPRESENT_PARAMETERS PParams;
    	ZeroMemory(&PParams, sizeof(D3DPRESENT_PARAMETERS));
    	PParams.BackBufferFormat = D3DFMT_UNKNOWN;
    	PParams.BackBufferWidth = SCREEN_WIDTH;
    	PParams.BackBufferHeight = SCREEN_HEIGHT;
    	PParams.BackBufferCount = 1;
    	PParams.MultiSampleType = D3DMULTISAMPLE_NONE;
    	PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
    	PParams.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
    	PParams.Windowed = true;
    
    	m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_MIXED_VERTEXPROCESSING, &PParams, &m_D3DDevice);
    	m_D3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    
    	D3DXCreateTeapot(m_D3DDevice, &m_D3DMesh, NULL);
    }
    
    BasicD3D::BasicD3D()
    {
        m_pD3D = NULL;
        m_D3DDevice = NULL;
    	m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    }
    
    void BasicD3D::CleanUpD3D()
    {
    	SAFE_RELEASE(m_pD3D);
    	SAFE_RELEASE (m_D3DDevice);
    	SAFE_RELEASE (m_D3DMesh);
    }
    
    void BasicD3D::BeginScene(void)
    {
    	m_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    	m_D3DDevice->BeginScene();
    }
    
    void BasicD3D::EndScene(void)
    {
    	m_D3DDevice->EndScene();
    	m_D3DDevice->Present(NULL, NULL, NULL, NULL);
    }
    
    void BasicD3D::RenderAct(void)
    {
    	D3DXMATRIX matView;
    	D3DXMATRIX matProjection;
    	D3DXMATRIX matRotateY;
    
    	static float index = 0.0f; index+=0.03f;    // an ever-increasing float value
    
    	D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3 (0.0f, 3.0f, 6.0f), &D3DXVECTOR3 (0.0f, 0.0f, 0.0f), &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));    
    	D3DXMatrixRotationY(&matRotateY, index);
    	D3DXMatrixPerspectiveFovLH(&matProjection, D3DXToRadian(45), (FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, 1.0f, 100.0f);  
    
    	m_D3DDevice->SetTransform(D3DTS_VIEW, &matView);
        m_D3DDevice->SetTransform(D3DTS_PROJECTION, &matProjection);
    	m_D3DDevice->SetTransform(D3DTS_WORLD, &(matRotateY));
    
    	m_D3DMesh->DrawSubset(0);
    }
    

    Main.cpp

    #include "BasicD3DHeader.h"
    
    MSG msg;
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    
    	//D3D Variablen
    	BasicD3D Direct3D;
    
    	//Normal Variablen
    	HWND hwnd;
    
    	hwnd = CreateMainWindow(hInstance);
    	Direct3D.InitD3D(hwnd);
    
    	while(msg.message != WM_QUIT)
    	{
    		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    		else
    		{
    			Direct3D.BeginScene();
    
    			if(GetAsyncKeyState(VK_ESCAPE) & 0x8000)
    			{
    				PostQuitMessage(0);
    			}
    
    			Direct3D.RenderAct();
    			Direct3D.EndScene();
    		}
    	}
    	Direct3D.CleanUpD3D();
    	return 0;
    }
    
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
            case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0;
                 break;
    
            case WM_KEYDOWN:
                   switch(wParam)
                   {
                     case VK_ESCAPE:
                             DestroyWindow(hwnd);
    						 break;
                   }
                 break;
        }
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    

    Folgenden Error meldet VC++ 2005 Express:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall BasicD3D::RenderAct(void)" (?RenderAct@BasicD3D@@QAEXXZ)" in Funktion "_WinMain@16".

    Edit3, jetzt gehts doch wieder, wenn ich

    Direct3D.RenderAct()
    

    auskommentiere, ich bitte um Hilfe. 😞

    Ich verstehe auch den Linker Error nicht. Benutzt die Funktion vielleicht Elemente die in einer anderen Lib liegen? d3d9 und d3dx9 habe ich doch gelinkt.

    Lösung:
    Keinen Schimmer warum, aber ich habe ein neues projekt gemacht, die Dateien eingefügt und es lief...


Anmelden zum Antworten