Fehler bei Direct3D (LNK2019)



  • Hallo Leute,

    ich habe mir heute ein neues leeres Projekt erstellt und ein Tutorial zu Direct3D begonnen. Da bekomm ich diese Fehlermeldung:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_D3D11CreateDeviceAndSwapChain@48" in Funktion ""void __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAXPAUHWND__@@@Z)".
    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Sonst kommen keine Fehler im Compiler.

    Woran kann das liegen?
    Ich habe die DirectX SDK June 2010 installiert.

    #include <Windows.h>
    #include <WindowsX.h>
    
    #include <d3d11.h>
    #include <d3dx10.h>
    #include <d3dx11.h>
    
    #pragma comment (lib, "d3d11.lib")
    #pragma comment (lib, "d3dx10.lib")
    #pragma comment (lib, "d3dx11.lib")
    
    // Globals
    
    IDXGISwapChain *swapchain;
    ID3D11Device *dev;
    ID3D11DeviceContext *devcon;
    
    // Prototypes
    
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    
    void InitD3D(HWND hWnd);
    void CleanD3D();
    
    // Main
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
    {
    	HWND hWnd;
    	WNDCLASSEX WndClassEx;
    
    	ZeroMemory(&WndClassEx, sizeof(WNDCLASSEX));
    
    	WndClassEx.cbSize = sizeof(WNDCLASSEX);
    	WndClassEx.style = CS_HREDRAW | CS_VREDRAW;
    	WndClassEx.lpfnWndProc = WindowProc;
    	WndClassEx.hInstance = hInstance;
    	WndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW);
    	WndClassEx.hbrBackground = (HBRUSH)COLOR_WINDOW;
    	WndClassEx.lpszClassName = "WindowClass";
    
    	RegisterClassEx(&WndClassEx);
    
    	RECT wr = {0, 0, 1280, 720};
    
    	AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);
    
    	hWnd = CreateWindowEx(NULL, "WindowClass", "Hallo", WS_OVERLAPPEDWINDOW, 300, 175, wr.right - wr.left, wr.bottom - wr.top, NULL, NULL, hInstance, NULL);
    
    	ShowWindow(hWnd, iCmdShow);
    
    	MSG msg = {0};
    
    	while (TRUE)
    	{
    		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    		{
    			TranslateMessage(&msg);
    
    			DispatchMessage(&msg);
    
    			if (msg.message == WM_QUIT)
    			{
    				break;
    			}
    		}
    	}
    
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    		case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    
    			return 0;
    		}
    	}
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    // Methods
    
    void InitD3D(HWND hWnd)
    {
    	DXGI_SWAP_CHAIN_DESC scd;
    
    	ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
    
    	scd.BufferCount = 1;
    	scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    	scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    	scd.OutputWindow = hWnd;
    	scd.SampleDesc.Count = 4;
    	scd.Windowed = TRUE;
    
    	D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL, D3D11_SDK_VERSION, &scd, &swapchain, &dev, NULL, &devcon);
    }
    
    void CleanD3D()
    {
    	swapchain -> Release();
    	dev -> Release();
    	devcon -> Release();
    }
    

    Hat jemand eine Idee?



  • Link mal gegen die 32bit Libraries und nicht die x64.



  • Wie geht das?
    Ich seh da keine 32 oder 64.



  • SChau in deinen Projekteinstellungen oder in deinen Verzeichnissen nach.
    Unter C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib gibt es einen x64 und einen x86 Ordner. Der x86 Ordner sollte im Pfad eingetragen sein wenn du einen 32bit Compiler verwendest.



  • Kann ich nicht einfach einen 64bit Compiler verwenden?



  • Wenn ich die 32bit Libs verwende kann der Compiler die d3dx10.lib und die d3dx11.lib nicht öffnen.



  • OK, es geht jetzt.
    Ich hatte x32, statt x86 eingegeben 😉



  • Vyax schrieb:

    Kann ich nicht einfach einen 64bit Compiler verwenden?

    Sicher, wenn du einen hast...


Anmelden zum Antworten