DirectX; Fehler beim kompilieren



  • Hi,
    ich programmiere schon etwas länger mit C++. Jetzt habe ich mich in die Windows-Programmierung eingearbeitet und wollte dann mit DirectX anfangen. Ich verwende Code::Blocks (IDE)mit dem Microsoft Visual Toolkit 2003 und ich hab auch schon DirectX installiert und in Code::Blocks die Pfadangabe zu den DirectX-Headerdateien hinzugefügt (wie in meinem Buch beschrieben). Jetzt habe ich den Code des ersten Beispielprogramms kopiert und versucht zu kompilieren, stoße aber auf eine Fehlermeldung vom Compiler. Hier der Code:

    // Dieses Programm zeigt, wie Text mit DirectX Graphics ausgegeben wird
    
    // Headerdateien
    #include <d3d9.h>
    #include <d3dx9.h>
    
    // Anwendungsfenster erzeugen
    HWND CreateMainWindow(HINSTANCE hInstance);
    
    // Callback Funktion zur Nachrichtenbehandlung
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
    
    // Funktion zur Initialisierung von Direct3D
    BOOL InitDirect3D(HWND hWnd);
    
    // Direct3D-Objekte wieder freigeben
    void CleanUpDirect3D(void);
    
    // Direct3D-Font erzeugen
    void CreateD3DFont(void);
    
    // Zeiger auf das Direct3D-Objekt (Interface)
    LPDIRECT3D9       lpD3D       = NULL;
    
    // Zeiger auf das Direct3D-Device
    LPDIRECT3DDEVICE9 lpD3DDevice = NULL;
    
    // Zeiger auf das Direct3D-Font-Objekt
    LPD3DXFONT        lpD3DFont   = NULL;
    
    // Das Fensterhandle
    HWND hWnd = 0;
    
    // Windows main-Funktion
    int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                       HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                       LPSTR lpCmdLine,          // Kommandozeile
                       int nCmdShow)             // Art wie das Fenster angezeigt werden soll
    {
        // Fenster erzeugen und Handle speichern
        hWnd = CreateMainWindow(hInstance);
    
        // Wenn der Rueckgabewert 0 ist, ist ein Fehler aufgetreten
        if(0 == hWnd)
        {
            MessageBox(0, "Fenster konnte nicht erzeugt werden", "Fehler", MB_OK);
            return -1;
        }
    
        // Direct3D initialisieren
        if(!InitDirect3D(hWnd))
        {
    		return -1;
    	}
    
        // Schrift erzeugen
        CreateD3DFont();
    
    	// Struktur, in der Informationen zur Nachricht gespeichert werden
        MSG msg;
    
        // Diese Schleife laeuft bis die Nachricht WM_QUIT empfangen wird
        while(GetMessage(&msg, NULL, 0, 0))
    	{
            // Nachricht an die Callbackfunktion senden
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        // Freigeben der Objekte
        CleanUpDirect3D();
    
        // Rückgabewert an Windows
        return 0;
    }
    
    // Fenster erzeugen
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
        WNDCLASSEX wndClass =
        {
            sizeof(WNDCLASSEX),                                 // Groesse angeben
            CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile
            MessageHandler,                                     // Callback-Funktion
            0,                                                  // Zusaetzliche Angaben
            0,                                                  // nicht benoetigt
            hInstance,                                          // Anwendungsinstanz
            LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
            LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
            (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weisser Pinsel
            NULL,                                               // kein Menue
            "WindowClass",                                      // Der Name der Klasse
            LoadIcon(NULL, IDI_WINLOGO)                         // Windows Logo
        };
    
        // Klasse registrieren
        RegisterClassEx(&wndClass);
    
        return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                              "WindowClass",          // Klassenname
                              "D3DDrawText",          // Fenstertitel
                              WS_OVERLAPPEDWINDOW |   // Fenster
                              WS_VISIBLE,             // Eigenschaften
                              50, 50, 800, 600,       // Anfangsposition und Groesse
                              NULL,                   // Handle des Elternfensters
                              NULL,                   // Handle des Menues
                              hInstance,              // Anwendungsinstanz
                              NULL);                  // wird nicht benoetigt
    }
    
    // Diese Funktion wird von Windows aufgrufen, wenn
    // eine Nachricht fuer Ihr Programm vorliegt
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        // Farbe fuer die Fuellung des Backbuffer festlegen
        D3DCOLOR ClearColor = D3DCOLOR_XRGB(0, 0, 0xFF);
    
        // testen, um welche Nachticht es sich handelt
        switch(msg)
        {
            // Programm beenden, wenn das Fenster
            // geschlossen wird
            case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0;
                 break;
    
            case WM_KEYDOWN:
                   switch(wParam)
                   {
                     // Wenn ESC gedrückt, Anwendung beenden
                     case VK_ESCAPE:
                             DestroyWindow(hWnd);
                          break;
                   }
                 break;
    
           case WM_PAINT:
    
                   D3DCOLOR ClearColor = D3DCOLOR_XRGB(0, 0, 0xFF);
                   D3DCOLOR TextColor  = D3DCOLOR_XRGB(0xFF, 0, 0);
    
                   // Rechteck anlegen, nur die linke, obere
                   // Koordinate festlegen, die andere wird
                   // berechnet
    
                   // Puffer mit blau fuellen
                   lpD3DDevice->Clear(0, 0,
                                      D3DCLEAR_TARGET,
                                      ClearColor,
                                      0, 0);
    
                   RECT r = { 100, 100, 0, 0 };
    
                   lpD3DDevice->BeginScene();
    
                   // Groessee des Rechtecks berechnen
                   lpD3DFont->DrawText(NULL,
                                       "Hallo Direct3D",
                                       -1,
                                       &r,
                                       DT_CALCRECT,
                                       TextColor);
    
                   // Text ausgeben
                   lpD3DFont->DrawText(NULL,
                                       "Hallo Direct3D",
                                       -1,
                                       &r,
                                       DT_CENTER,
                                       TextColor);
    
                   lpD3DDevice->EndScene();
    
                   // Szene anzeigen
                   lpD3DDevice->Present(0, 0, 0, 0);
    
                 break;
    
        }
    
        // Standardnachrichtenverarbeitung von Windows
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    
    // Direct3D initialisieren
    BOOL InitDirect3D(HWND hWnd)
    {
        // Direct3D-Objekt erzeugen
        lpD3D = Direct3DCreate9(D3D_SDK_VERSION);
    
        if(NULL == lpD3D)
        {
         // Fehler, D3D-Objekt wurde nicht erzeugt
         return FALSE;
        }
    
        // Parameter für den Modus festlegen
        D3DPRESENT_PARAMETERS PParams;
        ZeroMemory(&PParams, sizeof(PParams));
    
        PParams.SwapEffect     = D3DSWAPEFFECT_DISCARD;
        PParams.hDeviceWindow  = hWnd;
        PParams.Windowed       = TRUE;
    
        PParams.BackBufferWidth  = 800;
        PParams.BackBufferHeight = 600;
        PParams.BackBufferFormat = D3DFMT_A8R8G8B8;
    
        // Direct3D-Geraet anlegen
        if(FAILED(lpD3D->CreateDevice(
                                     D3DADAPTER_DEFAULT,
                                     D3DDEVTYPE_HAL,
                                     hWnd,
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                     &PParams,
                                     &lpD3DDevice)))
        {
            // Fehler, kann Geraet nicht anlegen
            return FALSE;
        }
    
       return TRUE;
    }
    
    void CreateD3DFont(void)
    {
      // Struktur fuer die Beschreibung der Schriftart
      // anlegen und Elemente mit 0 initialisieren
      D3DXFONT_DESC FontDesc = { 0 };
    
      // das Element FaceName muss den Namen der
      // gewuenschten Schriftart enthalten
      strcpy(FontDesc.FaceName, "Arial");
    
      // nach erfolgreichem Aufruf zeigt lpD3DFont
      // auf ein Objekt vom Typ D3DXFont
      D3DXCreateFontIndirect(lpD3DDevice,
                             &FontDesc,
                             &lpD3DFont);
    }
    
    // Direct3D Objekte freigeben
    void CleanUpDirect3D(void)
    {
        // testen, ob die Objekt angelegt
        // wurden und ggf. freigeben
    
        if(NULL != lpD3DFont)
        {
            lpD3DFont->Release();
            lpD3DFont = NULL;
        }
    
        if(NULL != lpD3DDevice)
        {
            lpD3DDevice->Release();
            lpD3DDevice = NULL;
        }
    
        if(NULL != lpD3D)
        {
            lpD3D->Release();
            lpD3D = NULL;
        }
    }
    

    Und die daraus resultierende Fehlermeldung:

    Linking console executable: C:\Users\energetic\Desktop\Beispiel1.exe
    ssss.obj : error LNK2019: unresolved external symbol __imp__PostQuitMessage@4 referenced in function "long __stdcall MessageHandler(struct HWND__ *,unsigned int,unsigned int,long)" (?MessageHandler@@YGJPAUHWND__@@IIJ@Z)
    ssss.obj : error LNK2019: unresolved external symbol __imp__DefWindowProcA@16 referenced in function "long __stdcall MessageHandler(struct HWND__ *,unsigned int,unsigned int,long)" (?MessageHandler@@YGJPAUHWND__@@IIJ@Z)
    ssss.obj : error LNK2019: unresolved external symbol __imp__DestroyWindow@4 referenced in function "long __stdcall MessageHandler(struct HWND__ *,unsigned int,unsigned int,long)" (?MessageHandler@@YGJPAUHWND__@@IIJ@Z)
    ssss.obj : error LNK2019: unresolved external symbol _Direct3DCreate9@4 referenced in function "int __cdecl InitDirect3D(struct HWND__ *)" (?InitDirect3D@@YAHPAUHWND__@@@Z)
    ssss.obj : error LNK2019: unresolved external symbol _D3DXCreateFontIndirectA@12 referenced in function "void __cdecl CreateD3DFont(void)" (?CreateD3DFont@@YAXXZ)
    ssss.obj : error LNK2019: unresolved external symbol __imp__CreateWindowExA@48 referenced in function "struct HWND__ * __cdecl CreateMainWindow(struct HINSTANCE__ *)" (?CreateMainWindow@@YAPAUHWND__@@PAUHINSTANCE__@@@Z)
    ssss.obj : error LNK2019: unresolved external symbol __imp__RegisterClassExA@4 referenced in function "struct HWND__ * __cdecl CreateMainWindow(struct HINSTANCE__ *)" (?CreateMainWindow@@YAPAUHWND__@@PAUHINSTANCE__@@@Z)
    ssss.obj : error LNK2019: unresolved external symbol __imp__GetStockObject@4 referenced in function "struct HWND__ * __cdecl CreateMainWindow(struct HINSTANCE__ *)" (?CreateMainWindow@@YAPAUHWND__@@PAUHINSTANCE__@@@Z)
    ssss.obj : error LNK2019: unresolved external symbol __imp__LoadCursorA@8 referenced in function "struct HWND__ * __cdecl CreateMainWindow(struct HINSTANCE__ *)" (?CreateMainWindow@@YAPAUHWND__@@PAUHINSTANCE__@@@Z)
    ssss.obj : error LNK2019: unresolved external symbol __imp__LoadIconA@8 referenced in function "struct HWND__ * __cdecl CreateMainWindow(struct HINSTANCE__ *)" (?CreateMainWindow@@YAPAUHWND__@@PAUHINSTANCE__@@@Z)
    ssss.obj : error LNK2019: unresolved external symbol __imp__TranslateMessage@4 referenced in function _WinMain@16
    ssss.obj : error LNK2019: unresolved external symbol __imp__DispatchMessageA@4 referenced in function _WinMain@16
    ssss.obj : error LNK2019: unresolved external symbol __imp__GetMessageA@16 referenced in function _WinMain@16
    ssss.obj : error LNK2019: unresolved external symbol __imp__MessageBoxA@16 referenced in function _WinMain@16
    C:\Users\energetic\Desktop\ssss.exe : fatal error LNK1120: 14 unresolved externals
    Process terminated with status 1120 (0 minutes, 1 seconds)
    15 errors, 0 warnings
    

    Was ist da schif gelaufen? Hab schon gegoogelt aber nix brauchbares gefungen 😞

    Mfg energetic



  • Du musst in den Linker-Einstellungen Deiner IDE die benoetigten Libraries angeben.
    Welche das genau sind, kannst Du in der MSDN anhand der fehlenden Funktionen nachschlagen (zb MessageBox: User32.lib).



  • thx,
    jetzt geht's. Aber in meinem Buch steht kein Wörtchen davon. 😕

    mfg energetic



  • Ja, ich hab das gleiche Buch, und gleich noch ein Tipp: Du musst nachdem du die DirectX Sachen durch bist, extrem viel üben, sonst kannst du später kaum programmieren. Weiters vergiss nicht, die Engine zu erweitern und neue Funktionen zu schreiben 😉


Anmelden zum Antworten