# [C++] 2 Linker-fehler (LNK2028,LNK2019)



## MSAB (12. August 2006)

N'abend, ich bin neu hier und lerne auch erst seit kurzem C++. Daher habe ich mir aus verschiedenen Tutorials was zusammengeschrieben. Nur jetzt knabbere ich seit ein paar Tagen an einer Fehlermeldung die partout nicht weggehen möchte.
Das "Programm" funktioniert auch wunderbar, bis auf die Funktion "Grafik_initalisieren", denn nehme ich den Befehl "Grafik_initalisieren();" heraus, kann er ihn fehlerlos compilieren.

Ich benutze als Compiler Visual C++ 2005 Express Edition.



Als Fehlermeldung erhalte ich folgende:

1>MAIN.obj : error LNK2028: unresolved token (0A000025) "void __cdecl Grafik_initalisieren(void)" (?Grafik_initalisieren@@$$FYAXXZ) referenced in function "bool __cdecl Bild_erstellen(void)" (?Bild_erstellen@@$$FYA_NXZ)
1>MAIN.obj : error LNK2019: unresolved external symbol "void __cdecl Grafik_initalisieren(void)" (?Grafik_initalisieren@@$$FYAXXZ) referenced in function "bool __cdecl Bild_erstellen(void)" (?Bild_erstellen@@$$FYA_NXZ)
1>C:\Dokumente und Einstellungen\Admin\Eigene Dateien\Visual Studio 2005\Projects\Engine\Debug\Engine.exe : fatal error LNK1120: 2 unresolved externals

Hier ist nochmal der gekürtzt Code, und ich hoffe ich habe nichts vergessen 


```
///////////////////////////////////Header//////////////////////////////////
#include <windows.h>
#include <d3d9.h>
 
////////////////////////////////////Globale Variablen//////////////////////
//Direct X
LPDIRECT3D9				D3D9				    ;
LPDIRECT3DDEVICE9		D3D9Dev			 = NULL ;
LPDIRECT3DVERTEXBUFFER9 D3DVertexBuffer9 = NULL ;

//Für Fenster
HWND hWnd;

//Für Bildschrimgröße
int nBreite = GetSystemMetrics(SM_CXSCREEN);
int nHoehe  = GetSystemMetrics(SM_CXSCREEN);

//Für Framebremse
DWORD dwStartzeit;

/////////////////////////////////////Funktionen/////////////////////////////

bool Bild_erstellen       (void);
void Bild_rendern         (void);
void Programm_beenden     (void);
void Grafik_initalisieren (void);

/////////////////////////////////////Strukturen/////////////////////////////

struct VERTEX {float x , y , z , rhw ; DWORD color ;};
#define COSTUMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE )

/////////////////////////////////////CallBack-Funktion//////////////////////

LRESULT CALLBACK WindowProc (HWND hWnd , UINT Msg , WPARAM wParam , LPARAM lParam)
{gekürzt}

///////////////////////////////////////WinMain-Funktion///////////////////////

int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , 
                     LPSTR     lpCmdLine , int       nShowCmd      ) 
{gekürtz};  

/////////////////////////////////////////////PHASE 1////////////////////////////////
bool Bild_erstellen(void) 
{
        //Present Parameter festlegen und Eingeschaften bestimmen
        D3DPRESENT_PARAMETERS D3DPP;

        SecureZeroMemory(&D3DPP , sizeof(D3DPP));
        D3DPP.hDeviceWindow    = hWnd                  ;
        D3DPP.Windowed         = false                 ;
        D3DPP.SwapEffect       = D3DSWAPEFFECT_DISCARD ;
		D3DPP.BackBufferFormat = D3DFMT_X8R8G8B8       ;
		D3DPP.BackBufferWidth  = nBreite			   ;
		D3DPP.BackBufferHeight = nHoehe                ;
                       
        //Direct X Objekt erzeugen
        if(!(D3D9 = Direct3DCreate9(D3D_SDK_VERSION)))
        return false;
        
        //Bild erstellen
        D3D9 -> CreateDevice ( D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , hWnd , 
                               D3DCREATE_HARDWARE_VERTEXPROCESSING , &D3DPP , &D3D9Dev );
		
		//Grafik initalisieren
		Grafik_initalisieren();
		return true;
};
;
////////////////////////////////////////////PHASE 2///////////////////////////////////

void Bild_rendern(void)
{gekürzt};

////////////////////////////////////////////PHASE 3/////////////////////////////////////

void Programm_beenden(void)
{gekürzt};

/////////////////////////////////////////////PHASE 4//////////////////////////////////////

void Grafik_initialisieren(void)
{
	
	VERTEX t_vert[] =
	{
		{ 	nBreite / 2, nHoehe * 0.03125,
			0.5f, 1.0f, D3DCOLOR_XRGB(255, 200, 0), },
      		{ 	nBreite - (nBreite * 0.0234375), nHoehe - (nHoehe * 0.03125),
			0.5f, 1.0f, D3DCOLOR_XRGB(100, 0, 0), },
      		{ 	nBreite * 0.0234375, nHoehe - (nHoehe * 0.03125),
			0.5f, 1.0f, D3DCOLOR_XRGB(125, 75, 0), },
	};

	D3D9Dev->CreateVertexBuffer(	3*sizeof(VERTEX), 0 , COSTUMFVF ,
									D3DPOOL_MANAGED , &D3DVertexBuffer9 , NULL);
	
	VOID* pVoid;

	D3DVertexBuffer9 -> Lock(0 , 0 , (void**)&pVoid , 0);
       memcpy(pVoid , t_vert , sizeof(t_vert))             ;
	D3DVertexBuffer9 -> Unlock()                        ;

	return;
}
```


----------



## Flegmon (12. August 2006)

MSAB hat gesagt.:
			
		

> void Grafik_initalisieren (void);




dein Problem ist einfacher als du denkst xD

Du hast dich einfach vertippt.

du hast initalisieren anstelle von initialisieren geschrieben.

EDIT: übrigens, wenn das eine Engine werden soll, dann kann ich dier nur empfehlen Klassen zu verwenden und nimm Aussagekräftigere Namen für deine Funktionen...

Unter Bild_erstellen versteh ich nicht die initialisieren von Direct3D


----------



## MSAB (12. August 2006)

Boa, verdammt. Und ich sitz da Tage davor.  :suspekt:
Naja, danke. Ich hab den Wald vorlauter Bäumen wohl nicht mehr gesehen 

Trotzdem hab ich jetzt das nächste Problem. Compilieren lässt sich das jetzt, aber das Programm stürtzt ab. Da kommt wohl noch viel Arbeit auf mich zu...

//Edit auf dein EDit: Joa, das soll es mal werden. Wie gesagt, bin noch nicht lange dabei und hab erstma die bezeichnugnen aus den Tutorials genommen


----------



## Flegmon (12. August 2006)

Das mit dem abstürzen, das Problem hatte ich am Anfang auch, dass es nie sofort gehen wollte ^^

Versuche das ganze im Fenster auszuführen, dann kannst du auch mit dem Debugger arbeiten. Das erleichtert die Fehlersuche enorm.

Es ist nur so, vor allem bei DirectX, dass der Fehler oft nicht da is, wo der Debugger hält -.-



			
				MSAB hat gesagt.:
			
		

> Wie gesagt, bin noch nicht lange dabei und hab erstma die bezeichnugnen aus den Tutorials genommen



Wenn die Funktionen in deinem Tutorial so genannt werden, kann ich dier nur empfehlen ein anderes zu suchen.

Ich würde dir empfehlen ein Buch zu dem Thema zu kaufen. Die sind zwar oft teuer (~30 - 50€) aber da hat man wenigstens ein Rundumwerk, dass alle Grundlagen behandelt.


----------



## MSAB (13. August 2006)

Thx für den Tipp, dass ich's im Fenster ausführen sollte, der Debugger war anschließend nämlich überflüssig. Das "Programm" funktioniert im Fenstermodus wunderbar, aber im halt Vollbild nicht  .
Im Vollbild wiederum funktioniert es, wenn ich die Funktion Grafik_initialisieren nicht drinnen hab.
Die Funktion scheint sich also mit dem Vollbild nicht zu vertragen
Manmanman...

Das mit dem Buch hatte ich auch schon überlegt, werd ich vll. auch später mal machen.


----------

