Problem beim Kompilieren der Beispiele des Buches 3d-Spieleprogrammierung



  • ps: bei dem einem hat nur eine Datei gefehlt, die ich jetzt rüberkopiert habe, also hab ich jetzt nur noch 1 dx9 sdk included



  • Komisch, wenn ich das Plattform-sdk weglasse, zeigt er keine fehler an, aber das fenster wird auch nicht gestartet -.-



  • Hast du denn auch die Lib und Include-Pfade bekannt gemacht?
    DAs kann man bei Extras->Optionen->Projekte und Projektmappen->Vc++Verzeichnisse einstellen. Das wird aber auch in dem Buch erklärt. So ziemlich am Anfang. (S.25 ff)



  • @jochen

    Die Tuer schrieb:

    Und in den VC++ Verzeichnissen habe ich drin:
    Microsoft DirectX SDK
    DX9 SDK
    Tribase
    Microsoft SDK



  • Die Tuer schrieb:

    @jochen

    Die Tuer schrieb:

    Und in den VC++ Verzeichnissen habe ich drin:
    Microsoft DirectX SDK
    DX9 SDK
    Tribase
    Microsoft SDK

    Oh, Mist. 🙄
    Da hätte ich mal besser sorgfältiger gelesen...



  • Das sind doch auch Sachen, die schon seit anfang an in VS da sind, oder nicht
    (wie z.B. MessageBoxA)

    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__SetDlgItemTextA@12".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__DialogBoxParamA@20".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__EnableWindow@8".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__IsDlgButtonChecked@8".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__CheckDlgButton@12".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__EndDialog@8".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetDlgItem@8".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_Direct3DCreate9@4".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetSaveFileNameA@4".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetModuleHandleA@4".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__SendDlgItemMessageA@20".
    1>Direct3DEnum.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetOpenFileNameA@4".
    1>InitDirect3D.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_DXGetErrorDescription9A@4".
    1>InitDirect3D.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_DXGetErrorString9A@4".
    1>InitDirect3D.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__ShowCursor@4".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetStockObject@4".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__LoadCursorA@8".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__AdjustWindowRect@12".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetSystemMetrics@4".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__DefWindowProcA@16".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__CreateWindowExA@48".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__UnregisterClassA@8".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__SetRect@20".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__BeginPaint@8".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__FillRect@12".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__PostQuitMessage@4".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__RegisterClassExA@4".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__DestroyWindow@4".
    1>InitWindow.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__EndPaint@8".
    1>Main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__MessageBoxA@16".
    1>Main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__LoadIconA@8".
    1>MSVCRT.lib(crtexew.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__InterlockedExchange@8".
    1>MSVCRT.lib(crtexew.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__Sleep@4".
    1>MSVCRT.lib(crtexew.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__InterlockedCompareExchange@12".
    1>MSVCRT.lib(crtexew.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetStartupInfoA@4".
    1>MSVCRT.lib(gs_report.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__TerminateProcess@8".
    1>MSVCRT.lib(gs_report.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetCurrentProcess@0".
    1>MSVCRT.lib(gs_report.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__UnhandledExceptionFilter@4".
    1>MSVCRT.lib(gs_report.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__SetUnhandledExceptionFilter@4".
    1>MSVCRT.lib(unhandld.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__SetUnhandledExceptionFilter@4".
    1>MSVCRT.lib(gs_report.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__IsDebuggerPresent@0".
    1>MSVCRT.lib(gs_support.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__QueryPerformanceCounter@4".
    1>MSVCRT.lib(gs_support.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetTickCount@0".
    1>MSVCRT.lib(gs_support.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetCurrentThreadId@0".
    


  • Ich glaub, ich habe den Fehler gefunden, ich habe bei den lib-dateien des Windows SDKs /7.0/Lib/x64 angegeben und nicht /7.0/Lib jetzt zeigt er keine Fehler mehr an, aber das Fenster startet nicht 😞



  • So da hab ich den Fehler, dass das Fenster nicht startet, ich hab das mal Zeile für Zeile debugt und dann kam dies hier an der Schleifenfunktion raus:

    Unbehandelte Ausnahme bei 0x00bc345c in 1.Dreieck.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Eine Ausnahme (erste Chance) bei 0x00bc345c in 1.Dreieck.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Unbehandelte Ausnahme bei 0x00bc345c in 1.Dreieck.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Eine Ausnahme (erste Chance) bei 0x00bc345c in 1.Dreieck.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Unbehandelte Ausnahme bei 0x00bc345c in 1.Dreieck.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    

    -.- was ist das denn schon wieder



  • Poste doch mal den Code, in dem der Fehler vorkommt. Das sieht mit nach einem fehklerhaften Umgang mit einem Array aus, aber ohne Code kann ich das nicht beutreilen.

    MfG, Jochen



  • Hier der Code
    (Den Code habe ich von der CD kopiert und eingefügt, sollte also klappen...)

    #include <Windows.h>
    #include <TriBase.h>
    #include <D3D9.h>
    #include "..//..//Allgemeines//Direct3DEnum.h"
    #include "..//..//Allgemeines//InitWindow.h"
    #include "..//..//Allgemeines//InitDirect3D.h"
    #include "Resource.h"
    
    struct SVertex
    {
    	tbVector3			vPosition;	// Position des Vertex
    	DWORD				dwColor;	// Farbe des Vertex
    	static const DWORD	dwFVF;		// Vertexformat (statisch)
    };
    
    const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;
    
    // ******************************************************************5
    // Globale Variablen
    SDirect3DParameters	g_Direct3DParameters;	// Direct3D-Parameter
    float				g_fTime = 0.0f;			// Zeitzähler
    SVertex				g_aTriangleVertex[3];	// Die drei Vertizes des Dreiecks
    
    // ******************************************************************
    // Render-Funktion
    tbResult Render(float fNumSecsPassed)
    {
    	HRESULT		hResult;
    	tbMatrix	mRotation;		// Rotationsmatrix
    	tbMatrix	mTranslation;	// Translationsmatrix
    	tbMatrix	mWorld;			// Vereinende Weltmatrix
    
    	// Rotations- und Translationsmatrix des Dreiecks erzeugen
    	mRotation = tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f));
    	mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f));
    
    	// Beide Matrizen kombinieren und als Weltmatrix einsetzen
    	mWorld = mRotation * mTranslation;
    	g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));
    
    	// -------------------------------------------------------------
    
    	// Den Bildpuffer und den Z-Buffer leeren
    	if(FAILED(hResult = g_pD3DDevice->Clear(0,
    											NULL,
    											D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
    											D3DCOLOR_XRGB(0, 0, 63),
    											1.0f,
    											0)))
    	{
    		// Fehler beim Leeren!
    		MessageBoxA(g_hWindow, "Fehler beim Leeren der Puffer!",
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    	}
    
    	// Szene beginnen
    	g_pD3DDevice->BeginScene();
    
    	// Nun das Dreieck zeichnen
    	if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,	// Dreiecksliste
    											          1,					// 1 Dreieck
    													  g_aTriangleVertex,	// Vertexdaten
    													  sizeof(SVertex))))	// Vertexgröße
    	{
    		// Fehler beim Zeichnen!
    		MessageBoxA(g_hWindow, "Fehler beim Zeichnen des Dreiecks!",
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_STOP);
    	}
    
    	// Szene beenden
    	g_pD3DDevice->EndScene();
    
    	// Der große Moment: den Bildpuffer sichtbar machen
    	g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
    
    	return TB_OK;
    }
    
    // ******************************************************************
    // Move-Funktion
    tbResult Move(float fNumSecsPassed)
    {
    	// Zeitzähler erhöhen
    	g_fTime += fNumSecsPassed;
    
    	return TB_OK;
    }
    
    // ******************************************************************
    // Herunterfahren der Szene
    tbResult ExitScene()
    {
    	return TB_OK;
    }
    
    // ******************************************************************
    // Herunterfahren der Anwendung
    tbResult ExitApplication()
    {
    	// Szene herunterfahren
    	ExitScene();
    
    	// Direct3D und Fenster herunterfahren
    	ExitDirect3D();
    	ExitWindow();
    
    	// Engine herunterfahren
    	tbExit();
    
    	return TB_OK;
    }
    
    // ******************************************************************
    // Initialisieren der Szene
    tbResult InitScene()
    {
    	HRESULT		hResult;
    	tbMatrix	mProjection;
    	float		fAspect;
    
    	// Vertexformat setzen - Positions- und Farbangabe
    	if(FAILED(hResult = g_pD3DDevice->SetFVF(SVertex::dwFVF)))
    	{
    		// Fehler beim Setzen des Vertexformats!
    		TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR);
    	}
    
        // Beleuchtung und Culling ausschalten, Dithering aktivieren
    	g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    	g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    	g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);
    
    	// Das Bildseitenverhältnis berechnen
    	fAspect =   (float)(g_Direct3DParameters.VideoMode.Width)
    	          / (float)(g_Direct3DParameters.VideoMode.Height);
    
    	// Die Projektionsmatrix erzeugen
    	mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f),	// Sichtfeld: 90° (180°)
    					                 fAspect,				// Bildseitenverhältnis
    					                 0.1f,					// Nahe Clipping-Ebene
    					                 100.0f);				// Ferne Clipping-Ebene
    
    	// Projektionsmatrix einsetzen
    	g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));
    
    	// Initialisieren des Dreiecks
    	g_aTriangleVertex[0].vPosition	= tbVector3( 0.0f,  1.0f, 0.0f);
    	g_aTriangleVertex[1].vPosition	= tbVector3( 1.0f, -1.0f, 0.0f);
    	g_aTriangleVertex[2].vPosition	= tbVector3(-1.0f, -1.0f, 0.0f);
    	g_aTriangleVertex[0].dwColor	= tbColor(1.0f, 0.0f, 0.0f);
    	g_aTriangleVertex[1].dwColor	= tbColor(0.0f, 1.0f, 0.0f);
    	g_aTriangleVertex[2].dwColor	= tbColor(0.0f, 0.0f, 1.0f);
    
    	return TB_OK;
    }
    
    // ******************************************************************
    // Initialisierungsfunktion
    tbResult InitApplication()
    {
    	tbResult Result;
    
    	// TriBase-Engine initialisieren
    	tbInit();
    
    	// Direct3D-Optionen abfragen (vom Benutzer gewählt)
    	Result = GetDirect3DParameters(&g_Direct3DParameters);
    	if(Result == TB_ERROR)
    	{
    		// Es trat ein Fehler auf!
    		MessageBoxA(NULL, "Fehler beim Abzählen!", "Fehler",
    			       MB_OK | MB_ICONEXCLAMATION);
    		return TB_ERROR;
    	}
    	else if(Result == TB_CANCELED)
    	{
    		// Der Dialog wurde abgebrochen!
    		return TB_CANCELED;
    	}
    
    	// Fenster initialisieren. Die Größe hängt vom gewählten
    	// Videomodus ab, der in der Parameterstruktur gespeichert ist.
    	if(InitWindow(g_Direct3DParameters.VideoMode.Width,
    		          g_Direct3DParameters.VideoMode.Height,
    				  "Beispielprogramm Nr. 3: Das erste Dreieck",
    				  LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1))))
    	{
    		// Fehler beim Erstellen des Fensters!
    		MessageBoxA(NULL, "Fehler beim Erstellen des Fensters!",
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		return TB_ERROR;
    	}
    
    	// Direct3D mit den abgefragten Einstellungen initialisieren
    	if(InitDirect3D(&g_Direct3DParameters,
    		            g_hWindow))
    	{
    		// Fehler!
    		MessageBoxA(g_hWindow, "Fehler beim Initialisieren von Direct3D!",
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		ExitApplication();
    		return TB_ERROR;
    	}
    
    	// Szene initialisieren
    	if(InitScene())
    	{
    		// Fehler!
    		MessageBoxA(g_hWindow, "Fehler beim Initialisieren der Szene!",
    			       "Fehler", MB_OK | MB_ICONINFORMATION);
    		ExitApplication();
    		return TB_ERROR;
    	}
    
    	// Alles OK!
    	return TB_OK;
    }
    
    // ******************************************************************
    // Windows-Hauptfunktion
    int WINAPI WinMain(HINSTANCE hInstance,
    				   HINSTANCE hPrevInstance,
    				   char* pcCmdLine,
    				   int iShowCmd)
    {
    	tbResult Result;
    
    	// Initialisierung
    	Result = InitApplication();
    	if(Result == TB_CANCELED) return 0;
    	else if(Result)
    	{
    		MessageBoxA(NULL, "Fehler beim Initialisieren der Anwendung!",
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		return 1;
    	}
    
    	// Nachrichtenschleife
    	tbDoMessageLoop(Render, Move);
    
    	// Herunterfahren
    	ExitApplication();
    
    	return 0;
    }
    
    // ******************************************************************
    


  • In Zeile 234 cancelt der immer bei mir, und wenn ich diese Zeile weglasse, kommen die Fehler



  • Ps: Der Fehler kommt in Zeile
    40 vor, also bei

    g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));
    

    (ist doch nur ein Fehler)



  • Vielleicht wurde für g_pD3DDevice kein Speicher reserviert, weil im Auto sagt er bei g_pD3DDevice

    g_pD3DDevice 0x0000000000
    ->IUnknow {...}
    ->_vfprt CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden



  • Ich hab den Fehler jetzt etwas lokalisisiert:
    Bei der Funktion InitApplication gibt er mit TB_CANCELED zurück (in zeile 171 Result = GetDirect3DParameters(&g_Direct3DParameters);)
    Das komische ist, darüber steht was von

    // Direct3D-Optionen abfragen (vom Benutzer gewählt)
    bei mir kommt aber nicht so ein Abfragungsfenster o.O



  • Wow, 21500 Ergebnisse, wenn man bei Google "kompelieren" eingibt (liest man hier ja auch öfter mal). Bald steht's im Duden. 😃



  • na gut dann eben "kompilieren" 🙂

    (so, berichtigt)



  • Weiß keiner, was das Problem ist? 😞



  • Kannst du denn die Fertigen Projekte aus dem Buch kompilieren?



  • Die sind schon kompiliert, ich kann die .exe ausführen, da kommen keine Fehler.
    Wenn ich die Projekte kompilieren will, kommt eine Message Box, die mir sagt, dass das Programm nicht starten kann, da die Datei "\Projects\03 - Das erste Dreieck\Debug\Dreieck.exe" nicht gefunden werden kann.



  • Die Tuer schrieb:

    Die sind schon kompiliert, ich kann die .exe ausführen, da kommen keine Fehler.
    Wenn ich die Projekte kompilieren will, kommt eine Message Box, die mir sagt, dass das Programm nicht starten kann, da die Datei "\Projects\03 - Das erste Dreieck\Debug\Dreieck.exe" nicht gefunden werden kann.

    Wofür braucht man denn die .exe für das Kompilieren? Bei mir funktioniert das alles problemlos: einfach den Ordner "03 - Das erste Dreieck" auf die Festplatte ziehen, dann die Pfade für die Include-Dateien anpassen (Die Include-Dateien "Allgemeines.h", "InitDirect3D.h" und "InitWindow.h") und dann sollte das Erstellen klappen. Oder wie erstellst du das Projekt?


Anmelden zum Antworten