Directx11 链接器错误

Posted

技术标签:

【中文标题】Directx11 链接器错误【英文标题】:Directx11 Linker Error 【发布时间】:2013-07-30 02:30:26 【问题描述】:
            // include the basic windows header file
            #include <windows.h>
            #include <windowsx.h>
            #include <d3d11.h>
            #include <d3dx11.h>
            #include <d3dx10.h>

            // include the Direct3D Library file
            #pragma comment (lib, "d3d11.lib")
            #pragma comment (lib, "d3dx11.lib")
            #pragma comment (lib, "d3dx10.lib")

            // global declarations
            IDXGISwapChain *swapchain;             // the pointer to the swap chain interface
            ID3D11Device *dev;                     // the pointer to our Direct3D device interface
            ID3D11DeviceContext *devcon;           // the pointer to our Direct3D device context

            // function prototypes
            void InitD3D(HWND hWnd);     // sets up and initializes Direct3D
            void CleanD3D(void);         // closes Direct3D and releases memory



            HRESULT D3D11CreateDeviceAndSwapChain(
                IDXGIAdapter *pAdapter,
                D3D_DRIVER_TYPE DriverType,
                HMODULE Software,
                UINT Flags,
                D3D_FEATURE_LEVEL *pFeatureLevels,
                UINT FeatureLevels,
                UINT SDKVersion,
                DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,
                IDXGISwapChain **ppSwapChain,
                ID3D11Device **ppDevice,
                D3D_FEATURE_LEVEL *pFeatureLevel,
                ID3D11DeviceContext **ppDeviceContext);



            // 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)
            
                // the handle for the window, filled by a function
                HWND hWnd;
                // this struct holds information for the window class
                WNDCLASSEX wc;

                // clear out the window class for use
                ZeroMemory(&wc, sizeof(WNDCLASSEX));

                // fill in the struct with the needed information
                wc.cbSize = sizeof(WNDCLASSEX);
                wc.style = CS_HREDRAW | CS_VREDRAW;
                wc.lpfnWndProc = WindowProc;
                wc.hInstance = hInstance;
                wc.hCursor = LoadCursor(NULL, IDC_ARROW);
                wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
                wc.lpszClassName = L"WindowClass1";

                // register the window class
                RegisterClassEx(&wc);

                RECT wr = 0, 0, 500, 400;    // set the size, but not the position
                AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);    // adjust the size

                // create the window and use the result as the handle
                hWnd = CreateWindowEx(NULL,
                                      L"WindowClass1",    // name of the window class
                                      L"Our First Windowed Program",   // title of the window
                                      WS_OVERLAPPEDWINDOW,    // window style
                                      300,    // x-position of the window
                                      300,    // y-position of the window
                                      500,    // width of the window
                                      400,    // height of the window
                                      NULL,    // we have no parent window, NULL
                                      NULL,    // we aren't using menus, NULL
                                      hInstance,    // application handle
                                      NULL);    // used with multiple windows, NULL

                // display the window on the screen
                ShowWindow(hWnd, nCmdShow);

                // enter the main loop:
                // enter the main loop:

                // this struct holds Windows event messages
                MSG msg = 0;

                // Enter the infinite message loop
                while(TRUE)
                
                    // Check to see if any messages are waiting in the queue
                    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                    
                        // translate keystroke messages into the right format
                        TranslateMessage(&msg);

                        // send the message to the WindowProc function
                        DispatchMessage(&msg);

                        // check to see if it's time to quit
                        if(msg.message == WM_QUIT)
                            break;
                    
                    else
                    
                        // Run game code here
                        // ...
                        // ...
                    
                

                // return this part of the WM_QUIT message to Windows
                return msg.wParam;
            

            // this is the main message handler for the program
            LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
            
                // sort through and find what code to run for the message given
                switch(message)
                
                    // this message is read when the window is closed
                    case WM_DESTROY:
                        
                            // close the application entirely
                            PostQuitMessage(0);
                            return 0;
                         break;
                

                // Handle any messages the switch statement didn't
                return DefWindowProc (hWnd, message, wParam, lParam);
            

            // this function initializes and prepares Direct3D for use
            void InitD3D(HWND hWnd)
            
                // create a struct to hold information about the swap chain
                DXGI_SWAP_CHAIN_DESC scd;

                // clear out the struct for use
                ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));

                // fill the swap chain description struct
                scd.BufferCount = 1;                                    // one back buffer
                scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;     // use 32-bit color
                scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;      // how swap chain is to be used
                scd.OutputWindow = hWnd;                                // the window to be used
                scd.SampleDesc.Count = 4;                               // how many multisamples
                scd.Windowed = TRUE;                                    // windowed/full-screen mode

                // create a device, device context and swap chain using the information in the scd struct
                D3D11CreateDeviceAndSwapChain(NULL,
                                              D3D_DRIVER_TYPE_HARDWARE,
                                              NULL,
                                              NULL,
                                              NULL,
                                              NULL,
                                              D3D11_SDK_VERSION,
                                              &scd,
                                              &swapchain,
                                              &dev,
                                              NULL,
                                              &devcon);
            

            // this is the function that cleans up Direct3D and COM
            void CleanD3D()
            
                // close and release all existing COM objects
                swapchain->Release();
                dev->Release();
                devcon->Release();
            

            Error   29  error LNK2019: unresolved external symbol "long __cdecl D3D11CreateDeviceAndSwapChain(struct IDXGIAdapter *,enum D3D_DRIVER_TYPE,struct HINSTANCE__ *,unsigned int,enum D3D_FEATURE_LEVEL *,unsigned int,unsigned int,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *,struct ID3D11Device * *,enum D3D_FEATURE_LEVEL *,struct ID3D11DeviceContext * *)" (?D3D11CreateDeviceAndSwapChain@@YAJPAUIDXGIAdapter@@W4D3D_DRIVER_TYPE@@PAUHINSTANCE__@@IPAW4D3D_FEATURE_LEVEL@@IIPAUDXGI_SWAP_CHAIN_DESC@@PAPAUIDXGISwapChain@@PAPAUID3D11Device@@3PAPAUID3D11DeviceContext@@@Z) referenced in function "void __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAXPAUHWND__@@@Z)   C:\Users\Eric\Documents\Visual Studio 2012\Projects\d3dinit\d3dinit\Source.obj  d3dinit

我的lib目录指定为:

C:\Program Files (x86)\Microsoft DirectX SDK(2010 年 6 月)\Lib\x64

我的链接器设置也指定了这些库:

d3d11.lib d3dx11.lib d3dx10.lib

我粘贴在代码块末尾的链接器错误。 我想知道链接器错误的原因可能是什么?

提前谢谢...

【问题讨论】:

万一,你是在 VS 下编译你的项目的调试配置吗? 实际上是的。我在确定使用 x86 或 x64 的库时遇到了一些麻烦。尽管我有一个 x64 处理器,但这些程序似乎最适合 x86 库,但我不确定为什么。 【参考方案1】:

D3D11CreateDeviceAndSwapChain 前向声明错误。指向 pFeatureLevels 和 pSwapChainDesc 的指针应该是 const。这意味着链接器搜索一个有点不同的 D3D11CreateDeviceAndSwapChain 函数并且找不到它。修复它的最简单方法就是删除 D3D11CreateDeviceAndSwapChain 前向声明。

顺便说一句,当您使用 dx11 时,包含 dx10 头文件和链接 dx10 库是没有意义的。此外,DXSDK 已弃用并由Windows8 SDK 取代。

【讨论】:

以上是关于Directx11 链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

Directx11 项目将不显示图形输出

DirectX 11 啥是着色器资源视图

Directx11学习笔记 第一个D3D11程序

DirectX11 With Windows SDK--26 计算着色器:入门

DirectX11 With Windows SDK--15 几何着色器初探

DirectX11 C++ 着色器缓冲区在多边形布局描述中变为空