Reputation: 13768
I am trying to compile this:
#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;
}
It is a C code (Not C++). It is supposed to create direct3d device using DirectX 10. I am using cmake for my build system. Here is my CMakeLists file:
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)
However, when I try to compile, I get this linker error:
[ 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.
How can I successfully link this C code using DirectX SDK?
Upvotes: 0
Views: 3621
Reputation: 13013
Specific problems:
You are pointing to Lib/x86
library dir, but compiling against x64 architecture (I can see it by path to ...Bin\amd64\nmake.exe
). You should Delete CMake cache (incmake-gui
: menu "File" -> "Delete Cache") and re-configure for Visual Studio 10 2010
, not Visual Studio 10 2010 Win64
. Alternatively, you could point linker to Lib/x64
directory.
You are missing dxguid
library:
target_link_libraries(tut1 d3d10 d3dx10 dxguid)
Bonus:
There is no point of learning DirectX 10 in year 2015, it is obsolete. Learn DirectX 11 instead: it's the same API with more features.
DirectX SDK is obsolete and its usage is discouraged (by Microsoft). Last version was issued in June 2010, and you use even older version (August 2009). Microsoft has merged DirectX SDK with Windows SDK since version 8. See this answer for details.
There is no point of using Visual Studio 2010 in year 2015. It is almost 6 years old and does not support many modern C and C++ features (this means you have no chance to learn them). Use Visual Studio 2015. Community edition is free for non-commercial usage. You will get full kit and Windows SDK as well (just don't forget to mark "C++ dev tools" during installation).
There is no point of using cross-platform build system such as CMake for DirectX projects. DirectX is only available for Windows platform anyway.
Upvotes: 2