我試圖編譯這個:鏈接使用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代碼?
謝謝,這解決了我的問題。奇怪的是,在我閱讀的任何教程中,dxguid庫如何從未被提及過。此外,謝謝獎金信息,我不知道這些點。 – yasar