[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...