DirectX Linker Fehler [GELÖST, bitte Schließen]



  • Hab bereits die Suchfunktion bemüht, finde leider nichts :xmas1:

    Hallo erstmal,

    mein Problem ist Directx 9 (c).
    Ich mache im moment ein Tutorial dazu (bin grad bei Transforming Vertices).
    Jetzt kam die Transformation ins spiel, und aus irgendeinem schönen Grund will das einfach nicht klappen - egal, wie einfallsreich man ist.
    Ich bin grade dabei, folgendes zu tun.

    // include the basic windows header files and the Direct3D header file
    #include <windows.h>
    #include <windowsx.h>
    #include <d3d9.h>
    #include <d3dx9.h>
    
    // define the screen resolution
    #define SCREEN_WIDTH 800
    #define SCREEN_HEIGHT 600
    
    // include the Direct3D Library files
    #pragma comment (lib, "d3d9.lib")
    #pragma comment (lib, "d3dx9.lib")
    
    // global declarations
    LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
    LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
    LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL;    // the pointer to the vertex buffer
    
    // function prototypes
    void initD3D(HWND hWnd);    // sets up and initializes Direct3D
    void render_frame(void);    // renders a single frame
    void cleanD3D(void);    // closes Direct3D and releases memory
    void init_graphics(void);    // 3D declarations
    
    struct CUSTOMVERTEX {FLOAT X, Y, Z; DWORD COLOR;};
    #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)
    
    // the WindowProc function prototype
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    
    // the entry point for any Windows program
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
        HWND hWnd;
        WNDCLASSEX wc;
    
        ZeroMemory(&wc, sizeof(WNDCLASSEX));
    
        wc.cbSize = sizeof(WNDCLASSEX);
        wc.style = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc = WindowProc;
        wc.hInstance = hInstance;
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.lpszClassName = "WindowClass";
    
        RegisterClassEx(&wc);
    
        hWnd = CreateWindowEx(NULL, "WindowClass", "Our Direct3D Program",
                              WS_OVERLAPPEDWINDOW, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
                              NULL, NULL, hInstance, NULL);
    
        ShowWindow(hWnd, nCmdShow);
    
        // set up and initialize Direct3D
        initD3D(hWnd);
    
        // enter the main loop:
    
        MSG msg;
    
        while(TRUE)
        {
            while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    
            if(msg.message == WM_QUIT)
                break;
    
            render_frame();
        }
    
        // clean up DirectX and COM
        cleanD3D();
    
        return msg.wParam;
    }
    
    // this is the main message handler for the program
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
            case WM_DESTROY:
                {
                    PostQuitMessage(0);
                    return 0;
                } break;
        }
    
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
    
    // this function initializes and prepares Direct3D for use
    void initD3D(HWND hWnd)
    {
        d3d = Direct3DCreate9(D3D_SDK_VERSION);
    
        D3DPRESENT_PARAMETERS d3dpp;
    
        ZeroMemory(&d3dpp, sizeof(d3dpp));
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow = hWnd;
        d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
        d3dpp.BackBufferWidth = SCREEN_WIDTH;
        d3dpp.BackBufferHeight = SCREEN_HEIGHT;
    
        // create a device class using this information and the info from the d3dpp stuct
        d3d->CreateDevice(D3DADAPTER_DEFAULT,
                          D3DDEVTYPE_HAL,
                          hWnd,
                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                          &d3dpp,
                          &d3ddev);
    
        init_graphics();    // call the function to initialize the triangle
    
        d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);    // turn off the 3D lighting
    }
    
    // this is the function used to render a single frame
    void render_frame(void)
    {
        d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    
        d3ddev->BeginScene();
    
        // select which vertex format we are using
        d3ddev->SetFVF(CUSTOMFVF);
    
        // SET UP THE PIPELINE
    
        D3DXMATRIX matRotateY;    // a matrix to store the rotation information
    
        static float index = 0.0f; index+=0.05f;    // an ever-increasing float value
    
        // build a matrix to rotate the model based on the increasing float value
        D3DXMatrixRotationY(&matRotateY, index);
    
        // tell Direct3D about our matrix
        d3ddev->SetTransform(D3DTS_WORLD, &matRotateY);
    
        D3DXMATRIX matView;    // the view transform matrix
    
                           D3DXVECTOR3 a(0.0f, 0.0f, 10.0f),b(0.0f, 0.0f, 0.0f),c(0.0f, 1.0f, 0.0f);
    
        D3DXMatrixLookAtLH(&matView,&a, &b, &c);    // the up direction
    
        d3ddev->SetTransform(D3DTS_VIEW, &matView);    // set the view transform to matView
    
        D3DXMATRIX matProjection;     // the projection transform matrix
    
        D3DXMatrixPerspectiveFovLH(&matProjection,
                                   D3DXToRadian(45),    // the horizontal field of view
                                   (float)SCREEN_WIDTH / SCREEN_HEIGHT, // aspect ratio
                                   1.0f,    // the near view-plane
                                   100.0f);    // the far view-plane
    
        d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection);    // set the projection
    
        // select the vertex buffer to display
        d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
    
        // copy the vertex buffer to the back buffer
        d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
    
        d3ddev->EndScene();
    
        d3ddev->Present(NULL, NULL, NULL, NULL);
    }
    
    // this is the function that cleans up Direct3D and COM
    void cleanD3D(void)
    {
        v_buffer->Release();    // close and release the vertex buffer
        d3ddev->Release();    // close and release the 3D device
        d3d->Release();    // close and release Direct3D
    }
    
    // this is the function that puts the 3D models into video RAM
    void init_graphics(void)
    {
        // create the vertices using the CUSTOMVERTEX struct
        CUSTOMVERTEX vertices[] =
        {
            { 3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), },
            { 0.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
            { -3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), },
        };
    
        // create a vertex buffer interface called v_buffer
        d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                                   0,
                                   CUSTOMFVF,
                                   D3DPOOL_MANAGED,
                                   &v_buffer,
                                   NULL);
    
        VOID* pVoid;    // a void pointer
    
        // lock v_buffer and load the vertices into it
        v_buffer->Lock(0, 0, (void**)&pVoid, 0);
        memcpy(pVoid, vertices, sizeof(vertices));
        v_buffer->Unlock();
    }
    

    Es Compiliert schlecht:

    ||=== DIRECTX, Debug ===|
    C:\Directx 9 SDK\Include\d3d9types.h|25|warning: ignoring #pragma warning  [-Wunknown-pragmas]|
    C:\Directx 9 SDK\Include\d3d9types.h|1850|warning: ignoring #pragma warning  [-Wunknown-pragmas]|
    C:\Directx 9 SDK\Include\d3dx9math.h|19|warning: ignoring #pragma warning  [-Wunknown-pragmas]|
    C:\Directx 9 SDK\Include\d3dx9math.h|1761|warning: ignoring #pragma warning  [-Wunknown-pragmas]|
    C:\Directx 9 SDK\Include\d3dx9core.h|644|warning: multi-line comment [-Wcomment]|
    ...\main.cpp|12|warning: ignoring #pragma comment  [-Wunknown-pragmas]|
    ...\main.cpp|13|warning: ignoring #pragma comment  [-Wunknown-pragmas]|
    ...\main.cpp||In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':|
    ...\main.cpp|55|warning: passing NULL to non-pointer argument 1 of 'HWND__* CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)' [-Wconversion-null]|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    YGKXZ]+0x98)||undefined reference to `_except_list'|
    YGHXZ]+0x13)||undefined reference to `_except_list'|
    YGHXZ]+0x1b)||undefined reference to `_except_list'|
    YGHXZ]+0x77)||undefined reference to `_except_list'|
    YGHXZ]+0x13)||undefined reference to `_except_list'|
    YGXXZ]+0x21)||undefined reference to `??2@YAPAXI@Z'|
    YGXXZ]+0x29)||undefined reference to `??2@YAPAXI@Z'|
    YGXXZ]+0x46)||undefined reference to `??3@YAXPAX@Z'|
    YGXXZ]+0x55)||undefined reference to `??3@YAXPAX@Z'|
    YGXXZ]+0x5d)||undefined reference to `??3@YAXPAX@Z'|
    ||=== Build finished: 10 errors, 32 warnings ===|
    

    Anscheinend ignoriert er die Pragmas, die die Libs einbinden.
    Wenn ich die allerdings bei CodeBlocks (10.5) über die Projekteinstellungen miteinbinden lasse, und die Pragmas entferne,
    siehts so aus:

    ||=== DIRECTX, Debug ===|
    ...\main.cpp||In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':|
    ...\main.cpp|55|warning: passing NULL to non-pointer argument 1 of 'HWND__* CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)' [-Wconversion-null]|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    ||Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized|
    YGKXZ]+0x98)||undefined reference to `_except_list'|
    YGHXZ]+0x13)||undefined reference to `_except_list'|
    YGHXZ]+0x1b)||undefined reference to `_except_list'|
    YGHXZ]+0x77)||undefined reference to `_except_list'|
    YGHXZ]+0x13)||undefined reference to `_except_list'|
    YGXXZ]+0x21)||undefined reference to `??2@YAPAXI@Z'|
    YGXXZ]+0x29)||undefined reference to `??2@YAPAXI@Z'|
    YGXXZ]+0x46)||undefined reference to `??3@YAXPAX@Z'|
    YGXXZ]+0x55)||undefined reference to `??3@YAXPAX@Z'|
    YGXXZ]+0x5d)||undefined reference to `??3@YAXPAX@Z'|
    ||=== Build finished: 10 errors, 32 warnings ===|
    
    #if _MSC_VER >= 1200
    #pragma warning(push)
    #endif
    #pragma warning(disable:4201) // anonymous unions warning , hier ist ein Warning
    #if defined(_X86_) || defined(_IA64)
    #pragma pack(4)
    #endif
    

    Kompiliert das mit VC? für was steht in diesem fall _MSC_VER?

    Ich hab keinen Bock, schon wieder was aufzugeben. Kann mir einer Helfen?
    (ein link zu der selben/einer ähnlichen Frage wäre auch toll)

    VD im Voraus :xmas2:

    Edit: Parallel zum zweiten versuch oben (mit entfernten pragmas und in den einstellungen gelinkten libs), fehlt mir vielleicht einfach die uuid.lib?

    Edit²: Mein Compiler ist Mingw (4.6.1), benutzte CodeBlocks 10.5 (Windows 7)



  • Also, das Problem ist gelöst.

    1. Man muss keine Libs linken,
    2. Die Pragmas müssen rein und zwar so:

    #pragma comment(lib, "name")
    

    3. Mit Mingw klappt es irgwie nicht. Umschalten zu Visual C++ (Visual Studio 2010)

    Und nochmals Edit: Wunderbar klappts mit Mingw. Einfach Pragmas raus und d3d9.lib & d3dx9.lib linken - das wars. Wichtig ist allerdings, dass auch nur diese Libs gelinkt werden!!


Anmelden zum Antworten