Hallo Forum. Ich habe leider beim kompilieren eines programms immer wieder einen Linkererror. Dieser Error lautet wie folgt: main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall CInitDirect3D::Init(void)" (?Init@CInitDirect3D@@QAEXXZ)" in Funktion "_WinMain@16". Ich habe mit google herausgefunden, dass der Linker bei diesem Fehler die Datei nicht finden kann, dabei habe ich die Datei in diesem Projekt erstellt und befindet sich auch im Projektverzeichnis. Ich arbeite mit C++ und mein Quellcode sieht wiefolgt aus:
main.
|
C-/C++-Quelltext
|
1
|
|
#include <Windows.h>
#include "InitWindow.h"
#include "Logfile.h"
#include "pilVector3.h"
#include "test.h"
#define ERROROK(msg) MessageBox(NULL, msg, "ERROR", MB_OK)
HWND hWnd;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
DWORD dwTime1, dwTime2;
float fTime = 0.0f;
struct SVertex
{
pilVector3 vPosition;
DWORD dwCplor;
};
HRESULT hResult;
int tbDoMessageLoop(int (* pMoveProc)(float), int (* pRenderProc)(float));
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
//CInitWindow InitWindowInstance;
CInitDirect3D Hallo;
MSG Message;
WNDCLASS WndClass;
char *szAppName = "Die Abenteuer von Nerum";
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = szAppName;
if(!RegisterClass(&WndClass))
{
MessageBox (NULL, "Schwerwiegender Fehler beim registrieren der Fensterklassenstruktur. Bitte schreiben sie eine e-mail an: \npilzschafgamestudio-support@t-online.de", "Schwerwiegender Fehler!", MB_OK | MB_ICONEXCLAMATION);
return 0;
}
hWnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
Hallo.Init();
//InitWindowInstance.Init(hWnd);
g_pLogfile->CreateLogfile ("Logfile.html");
g_pLogfile->Del ();
//Nachrichtenschleife
ZeroMemory(&Message, sizeof(MSG));
while(Message.message != WM_QUIT)
{
dwTime1 = timeGetTime();
while(PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
//Rendern
//Bewegen
dwTime2 = timeGetTime();
fTime = (float) (dwTime2 - dwTime1) / 1000.0f;
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN:
{
switch(wParam)
{
case VK_ESCAPE:
{
PostQuitMessage(0);
return 0;
}
default:
{
return 0;
}
}
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
Meine Klasse liegt vorerst in der Datei test.h:
#include <Windows.h>
#include <d3d9.h>
#include <stdio.h>
#pragma once
// ******************************************************************
// Variablen
//VAR HWND g_hWindow;//
//extern HWND hWnd;
//HRESULT hResult;
class CInitDirect3D
{
public:
void Init();
//void Render();
//void Clean();
private:
//LPDIRECT3D9 D3D;
LPDIRECT3DDEVICE9 D3DDevice;
D3DPRESENT_PARAMETERS PresentParams;
};
Zum Schluss noch die Datei test.cpp
#include <d3d9.h>
#include "test.h"
#include "Logfile.h"
#include "pilVector3.h"
//#include <Windows.h>
void Init()
{
//HWND hWnd;
//HRESULT hResult;
PDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(!pD3D)
{
MessageBox(NULL, "Schwerwiegender Fehler beim erzeugen der Direct3D-Schnittstelle.Bitte schreiben sie eine e-mail an: \npilzschafgamestudio-support@t-online.de","Schwerwiegender Fehler!", MB_OK | MB_ICONEXCLAMATION);
}
D3DPRESENT_PARAMETERS PresentParams;
LPDIRECT3DDEVICE9 D3DDevice;
// Parameter prüfen
// Globale IDirect3D9-Schnittstelle erzeugen
pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(pD3D == NULL) MessageBox(NULL, "Fehler","Fehler",MB_OK | MB_ICONEXCLAMATION);
// Präsentationsstruktur ausfüllen
ZeroMemory(&PresentParams, sizeof(D3DPRESENT_PARAMETERS));
PresentParams.BackBufferWidth = 1280;
PresentParams.BackBufferHeight = 1024;
PresentParams.BackBufferFormat = D3DFMT_A8R8G8B8;
PresentParams.BackBufferCount = 1;
PresentParams.MultiSampleType = D3DMULTISAMPLE_8_SAMPLES;
PresentParams.MultiSampleQuality = 2;
PresentParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
PresentParams.hDeviceWindow = NULL;
PresentParams.Windowed = FALSE;
PresentParams.EnableAutoDepthStencil = TRUE;
PresentParams.AutoDepthStencilFormat = D3DFMT_D24S8;
PresentParams.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
PresentParams.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
PresentParams.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
// Und nun die Geräteschnittstelle generieren
pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
NULL,
D3DCREATE_MIXED_VERTEXPROCESSING,
&PresentParams,
&D3DDevice);
// Fehler beim Generieren der Schnittstelle!
//ExitDirect3D();
//TB_ERROR_DIRECT
"g_pD3D->CreateDevice", hResult, TB_ERROR);
// Es hat geklappt!
// Cursor im Vollbildmodus ausblenden
}
Ja ich weiß, es ist alles noch etwas unübersichtlich aber das aufräumen kommt, sobald es funktioniert.
Wenn irgendwer weiß, wo der Fehler liegt oder eine Vermutung hat, würde ich mich freuen, wenn er es mir mitteilen würde