Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Pilzschaf

Frischling

  • »Pilzschaf« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Freiburg

  • Private Nachricht senden

1

23.01.2013, 17:46

Linker Error

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_DIRECTX("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 ;)

Zitat

"Der Code ist schon schlecht."
"Ist doch Geschmackssache."
"Naja, es sind GOTOs drin."
"Oh."

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

2

23.01.2013, 17:57

So beim kurzen Überfliegen, deine Klasse CInitDirect3D Besitzt eine Init Methode, die Implementierung scheint aber dir entfallen zu sein (test.cpp). Bzw... du hast nur eine Init Funktion implementiert.

Edit1:
Du solltest auch versuchen c++ casts zu verwenden. (static_cast, dynamic_cast usw.) Typenumwandlung
:love: := Go;

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »H5::« (23.01.2013, 18:04)


Pilzschaf

Frischling

  • »Pilzschaf« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Freiburg

  • Private Nachricht senden

3

23.01.2013, 18:03

Wie meinst du jetzt? Also ich habe nur eine Initfunktion

Zitat

"Der Code ist schon schlecht."
"Ist doch Geschmackssache."
"Naja, es sind GOTOs drin."
"Oh."

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

4

23.01.2013, 18:09

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class CInitDirect3D 
{ 
public: 
void Init(); // <<<< Hier, die Methode findet der Linker nicht. 

//void Render(); 
//void Clean(); 
private: 
//LPDIRECT3D9 D3D; 
LPDIRECT3DDEVICE9 D3DDevice; 
D3DPRESENT_PARAMETERS PresentParams; 

};



Nur eine Init Funktion, es fehlt der Klassenname.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
... 
//#include <Windows.h> 
void Init() 
{ 
//HWND hWnd; 
//HRESULT hResult; 
PDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION); 
...
:love: := Go;

Techie

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

5

23.01.2013, 18:11

Verdammt gerade wollte ich auf Absenden drücken und dann war er schneller -.-

Aber egal. Ich hoffe ,dass das nur ein kleiner Fehler mit Face-Tisch-erlebniss ist. Ansonsten würde ich C++ nochmal neu lernen ^^
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

6

23.01.2013, 18:12

Benutze demnächst bitte Quellcodetags...

http://www.youtube.com/watch?v=nSg-Cd7TF3M#t=2656s
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Pilzschaf

Frischling

  • »Pilzschaf« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Freiburg

  • Private Nachricht senden

7

23.01.2013, 18:14

Ok danke, es funktioniert jetzt alles, das habe ich total übersehen ;) bzw, ich habe mit dem Fehler am falschen Platz gesucht :dash:

Zitat

"Der Code ist schon schlecht."
"Ist doch Geschmackssache."
"Naja, es sind GOTOs drin."
"Oh."

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

24.01.2013, 08:11

Wie kann man da am falschen Platz suchen?
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall CInitDirect3D::Init(void)

Da steht doch eindeutig, dass CInitDirect3D::Init(void) nicht gefunden werden kann.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige