PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SOLVED]DirectX9 Linker Error?



Schlurmann
30.09.2007, 04:13
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.


[SOLVED]
Gott weiß woran es lag. Neues Projekt gemacht, Dateien neu eingefügt, alles läuft.