2015-10-14 166 views
0

我試圖編譯這個:鏈接使用cmake

#define COBJMACROS 

#include <windows.h> 
#include <d3d10.h> 
#include <d3dx10.h> 

HWND     g_hWnd = NULL; 
ID3D10Device*   g_pd3dDevice = NULL; 
IDXGISwapChain*   g_pSwapChain = NULL; 
ID3D10RenderTargetView* g_pRenderTargetView = NULL; 

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) { 
    case WM_CLOSE: 
     DestroyWindow(hwnd); 
    break; 
    case WM_DESTROY: 
     PostQuitMessage(0); 
    break; 
    default: 
     return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } 

    return 0; 
} 

const char lpszClassName[] = "TutorialWindowClass"; 

HRESULT InitWindow(HINSTANCE hInstance,int nCmdShow) 
{ 
    HWND hwnd; 
    WNDCLASSEX wcex; 

    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc = WndProc; 
    wcex.cbClsExtra = 0; 
    wcex.cbWndExtra = 0; 
    wcex.hInstance = hInstance; 
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);; 
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
    wcex.lpszMenuName = NULL; 
    wcex.lpszClassName = lpszClassName; 
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 

    if(!RegisterClassEx(&wcex)) 
     return E_FAIL; 

    g_hWnd = CreateWindow(
     lpszClassName, 
     "DX10 TUT0: CreateWindow", 
     WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, CW_USEDEFAULT, // starting coordinates, Windows decide 
     640, 480, // window size 
     NULL, 
     NULL, 
     hInstance, 
     NULL 
    ); 

    if(!g_hWnd) 
     return E_FAIL; 

    ShowWindow(hwnd, nCmdShow); 

    return S_OK; 
} 

HRESULT InitDevice() 
{ 
    HRESULT hr = S_OK; 
    RECT rc; 
    UINT width; 
    UINT height; 
    DXGI_SWAP_CHAIN_DESC sd; 
    ID3D10Resource* pBackBuffer; 
    D3D10_VIEWPORT vp; 

    GetClientRect(g_hWnd, &rc); 
    width = rc.right - rc.left; 
    height = rc.bottom - rc.top; 

    ZeroMemory(&sd, sizeof(sd)); 
    sd.BufferCount = 1; 
    sd.BufferDesc.Width = width; 
    sd.BufferDesc.Height = height; 
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
    sd.BufferDesc.RefreshRate.Numerator = 60; 
    sd.BufferDesc.RefreshRate.Denominator = 1; 
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 
    sd.OutputWindow = g_hWnd; 
    sd.SampleDesc.Count = 1; 
    sd.SampleDesc.Quality = 0; 
    sd.Windowed = TRUE; 

    hr = D3D10CreateDeviceAndSwapChain(
     NULL, 
     D3D10_DRIVER_TYPE_HARDWARE, 
     NULL, 
     0, 
     D3D10_SDK_VERSION, 
     &sd, 
     &g_pSwapChain, 
     &g_pd3dDevice 
    ); 

    if (FAILED(hr)) 
     return hr; 


    hr = IDXGISwapChain_GetBuffer(g_pSwapChain, 0, &IID_ID3D10Texture2D, (LPVOID*)&pBackBuffer); 

    if(FAILED(hr)) 
     return hr; 

    hr = ID3D10Device_CreateRenderTargetView(g_pd3dDevice, pBackBuffer, NULL, &g_pRenderTargetView); 

    ID3D10Resource_Release(pBackBuffer); 

    if(FAILED(hr)) 
     return hr; 

    ID3D10Device_OMSetRenderTargets(g_pd3dDevice, 1, &g_pRenderTargetView, NULL); 

    // Setup the viewport 

    vp.Width = width; 
    vp.Height = height; 
    vp.MinDepth = 0.0f; 
    vp.MaxDepth = 1.0f; 
    vp.TopLeftX = 0; 
    vp.TopLeftY = 0; 

    ID3D10Device_RSSetViewports(g_pd3dDevice, 1, &vp); 

    return S_OK; 

} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    MSG msg; 

    if(FAILED(InitWindow(hInstance, nCmdShow))) 
     return 0; 


    // Main message loop 

    while(GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return (int)msg.wParam; 
} 

它是一個C代碼(不是C++)。它應該使用DirectX 10創建direct3d設備。我正在使用cmake構建我的構建系統。這裏是我的CMakeLists文件:

cmake_minimum_required (VERSION 2.6) 
project (DXTUTS C) 

include_directories("C:/Program Files (x86)/Microsoft DirectX SDK (August 2009)/Include") 
link_directories("C:/Program Files (x86)/Microsoft DirectX SDK (August 2009)/Lib/x86") 

add_executable(tut1 WIN32 tut1.c) 
target_link_libraries(tut1 d3d10 d3dx10) 

然而,當我嘗試編譯,我得到這個連接錯誤:

[ 50%] Linking C executable tut1.exe 
tut1.c.obj : error LNK2001: unresolved external symbol IID_ID3D10Texture2D 
tut1.c.obj : error LNK2019: unresolved external symbol D3D10CreateDeviceAndSwapC 
hain referenced in function InitDevice 
tut1.exe : fatal error LNK1120: 2 unresolved externals 
LINK Pass 1 failed. with 1120 
NMAKE : fatal error U1077: '"C:\Program Files (x86)\CMake\bin\cmake.exe"' : return code '0xffffffff' 
Stop. 
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\nmake.exe"' : return code '0x2' 
Stop. 
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\nmake.exe"' : return code '0x2' 
Stop. 

我怎樣才能成功鏈接使用DirectX SDK中該C代碼?

回答

0

具體問題:

  1. 您指向Lib/x86庫目錄,但對編譯x64體系結構(我可以通過路徑看它...Bin\amd64\nmake.exe)。您應該刪除CMake緩存(在cmake-gui:菜單「文件」 - >「刪除緩存」)並重新配置爲Visual Studio 10 2010,而不是Visual Studio 10 2010 Win64。或者,您可以將鏈接器指向Lib/x64目錄。

  2. 你缺少dxguid庫:

    target_link_libraries(tut1 d3d10 d3dx10 dxguid) 
    

獎勵:

  • 沒有在2015年學習的DirectX 10點它已經過時了。學習DirectX 11:它是具有更多功能的相同API。

  • DirectX SDK已過時,並且它的使用不受歡迎(由Microsoft提供)。最新版本於2010年6月發佈,您甚至可以使用舊版本(2009年8月)。從版本8起,Microsoft已將DirectX SDK與Windows SDK合併。有關詳細信息,請參閱this answer

  • 2015年在使用Visual Studio 2010沒有意義。它已近6年曆史,不支持許多現代C和C++功能(這意味着您沒有機會學習它們)。使用Visual Studio 2015. Community edition對於非商業用途是免費的。您將獲得完整的套件和Windows SDK(安裝期間不要忘記標記「C++開發工具」)。

  • 使用跨平臺構建系統(如CMake for DirectX項目)沒有意義。無論如何,DirectX僅適用於Windows平臺。

  • +0

    謝謝,這解決了我的問題。奇怪的是,在我閱讀的任何教程中,dxguid庫如何從未被提及過。此外,謝謝獎金信息,我不知道這些點。 – yasar