Problem beim Kompilieren der Beispiele des Buches 3d-Spieleprogrammierung



  • Hab ich jetzt bei einigen ausprobiert, aber kein Erfolg, immernoch 46 Fehler



  • Vielleicht liegt es ja auch an der Version, VS2008 Express...



  • Was für libs linkst du alles?



  • dot schrieb:

    Was für libs linkst du alles?

    Beitrag 1

    Die Tuer schrieb:

    TriBase.lib DXErr.lib Dxerr9.lib d3d9.lib d3dx9.lib dinput8.lib dxguid.lib winmm.lib odbc32.lib odbccp32.lib Gdi32.Lib User32.Lib AdvAPI32.Lib Comdlg32.lib Ole32.Lib Oleaut32.lib Comctl32.lib kernel32.lib shell32.lib
    


  • Bist du schon mal auf "Projekt bereinigen" und dann auf "Neu erstellen" gegangen?
    Danach schau einfach mal unter Projekteigenschaften --> VC++-Verzeichnisse nach ob da auch bei Bibliothekverzeichnisse die entsprechenden Verzeichnisse für das Platform SDK und das DXSDK eingetragen sind.

    Was mir gerade noch auf gefallen ist...sind diese libs auch case sensitive? Probier mal aus, ob es einen Unterschied zwischen User32.lib oder user32.lib gibt!



  • @udopolis
    Ich habe gemerkt dass ich eigentlich nur 4 der libs linken muss, der Rest hatte keine Auswirkung auf die Fehler, also waren überflüssig...

    @Nasghat
    Ich habe das Projekt bereinigt und neu erstellt, doch dann kommen wieder die gleichen Fehermeldungen...
    Und in den VC++ Verzeichnissen habe ich drin:
    Microsoft DirectX SDK
    DX9 SDK
    Tribase
    Microsoft SDK

    Wie du siehst habe ich 2 Dx sdk, wenn ich jedoch eins von Beiden weglasse, fehlen ein paar include-Dateien...
    Zu allen h-Dateien habe ich die passenden lib-Dateien eingebunden
    ps: Die Dateien sind nicht Case sensitive



  • 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


Anmelden zum Antworten