2012-12-21 235 views
2

好吧,所以我運行的是Visual Basic 2010 Express,我試圖在Direct X SDK中運行Tutorial#2;然而,由於某種原因,該程序不會編譯,儘管在我正在閱讀的教程中,它表示我只需要Direct X SDK和Visual Basic 2010 Express。我打開Tutorial02_2010.sln,並試圖編譯它。這裏的主文件的代碼:錯誤錯誤LNK1104:無法打開文件'winmm.lib'

//-------------------------------------------------------------------------------------- 
// File: Tutorial02.cpp 
// 
// This application displays a triangle using Direct3D 10 
// 
// Copyright (c) Microsoft Corporation. All rights reserved. 
//-------------------------------------------------------------------------------------- 
#include <windows.h> 
#include <d3d10.h> 
#include <d3dx10.h> 
#include "resource.h" 


//-------------------------------------------------------------------------------------- 
// Structures 
//-------------------------------------------------------------------------------------- 
struct SimpleVertex 
{ 
    D3DXVECTOR3 Pos; 
}; 


//-------------------------------------------------------------------------------------- 
// Global Variables 
//-------------------------------------------------------------------------------------- 
HINSTANCE    g_hInst = NULL; 
HWND     g_hWnd = NULL; 
D3D10_DRIVER_TYPE  g_driverType = D3D10_DRIVER_TYPE_NULL; 
ID3D10Device*   g_pd3dDevice = NULL; 
IDXGISwapChain*   g_pSwapChain = NULL; 
ID3D10RenderTargetView* g_pRenderTargetView = NULL; 
ID3D10Effect*   g_pEffect = NULL; 
ID3D10EffectTechnique* g_pTechnique = NULL; 
ID3D10InputLayout*  g_pVertexLayout = NULL; 
ID3D10Buffer*   g_pVertexBuffer = NULL; 


//-------------------------------------------------------------------------------------- 
// Forward declarations 
//-------------------------------------------------------------------------------------- 
HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow); 
HRESULT InitDevice(); 
void CleanupDevice(); 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
void Render(); 


//-------------------------------------------------------------------------------------- 
// Entry point to the program. Initializes everything and goes into a message processing 
// loop. Idle time is used to render the scene. 
//-------------------------------------------------------------------------------------- 
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) 
{ 
    UNREFERENCED_PARAMETER(hPrevInstance); 
    UNREFERENCED_PARAMETER(lpCmdLine); 

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

    if(FAILED(InitDevice())) 
    { 
     CleanupDevice(); 
     return 0; 
    } 

    // Main message loop 
    MSG msg = {0}; 
    while(WM_QUIT != msg.message) 
    { 
     if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
     else 
     { 
      Render(); 
     } 
    } 

    CleanupDevice(); 

    return (int)msg.wParam; 
} 


//-------------------------------------------------------------------------------------- 
// Register class and create window 
//-------------------------------------------------------------------------------------- 
HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow) 
{ 
    // Register class 
    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(hInstance, (LPCTSTR)IDI_TUTORIAL1); 
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
    wcex.lpszMenuName = NULL; 
    wcex.lpszClassName = L"TutorialWindowClass"; 
    wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_TUTORIAL1); 
    if(!RegisterClassEx(&wcex)) 
     return E_FAIL; 

    // Create window 
    g_hInst = hInstance; 
    RECT rc = { 0, 0, 640, 480 }; 
    AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE); 
    g_hWnd = CreateWindow(L"TutorialWindowClass", L"Direct3D 10 Tutorial 2: Rendering a Triangle", 
          WS_OVERLAPPEDWINDOW, 
          CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance, 
          NULL); 
    if(!g_hWnd) 
     return E_FAIL; 

    ShowWindow(g_hWnd, nCmdShow); 

    return S_OK; 
} 


//-------------------------------------------------------------------------------------- 
// Create Direct3D device and swap chain 
//-------------------------------------------------------------------------------------- 
HRESULT InitDevice() 
{ 
    HRESULT hr = S_OK; 

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

    UINT createDeviceFlags = 0; 
#ifdef _DEBUG 
    createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG; 
#endif 

    D3D10_DRIVER_TYPE driverTypes[] = 
    { 
     D3D10_DRIVER_TYPE_HARDWARE, 
     D3D10_DRIVER_TYPE_REFERENCE, 
    }; 
    UINT numDriverTypes = sizeof(driverTypes)/sizeof(driverTypes[0]); 

    DXGI_SWAP_CHAIN_DESC sd; 
    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; 

    for(UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++) 
    { 
     g_driverType = driverTypes[driverTypeIndex]; 
     hr = D3D10CreateDeviceAndSwapChain(NULL, g_driverType, NULL, createDeviceFlags, 
              D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice); 
     if(SUCCEEDED(hr)) 
      break; 
    } 
    if(FAILED(hr)) 
     return hr; 

    // Create a render target view 
    ID3D10Texture2D* pBuffer; 
    hr = g_pSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBuffer); 
    if(FAILED(hr)) 
     return hr; 

    hr = g_pd3dDevice->CreateRenderTargetView(pBuffer, NULL, &g_pRenderTargetView); 
    pBuffer->Release(); 
    if(FAILED(hr)) 
     return hr; 

    g_pd3dDevice->OMSetRenderTargets(1, &g_pRenderTargetView, NULL); 

    // Setup the viewport 
    D3D10_VIEWPORT vp; 
    vp.Width = width; 
    vp.Height = height; 
    vp.MinDepth = 0.0f; 
    vp.MaxDepth = 1.0f; 
    vp.TopLeftX = 0; 
    vp.TopLeftY = 0; 
    g_pd3dDevice->RSSetViewports(1, &vp); 

    // Create the effect 
    DWORD dwShaderFlags = D3D10_SHADER_ENABLE_STRICTNESS; 
#if defined(DEBUG) || defined(_DEBUG) 
    // Set the D3D10_SHADER_DEBUG flag to embed debug information in the shaders. 
    // Setting this flag improves the shader debugging experience, but still allows 
    // the shaders to be optimized and to run exactly the way they will run in 
    // the release configuration of this program. 
    dwShaderFlags |= D3D10_SHADER_DEBUG; 
    #endif 
    hr = D3DX10CreateEffectFromFile(L"Tutorial02.fx", NULL, NULL, "fx_4_0", dwShaderFlags, 0, 
             g_pd3dDevice, NULL, NULL, &g_pEffect, NULL, NULL); 
    if(FAILED(hr)) 
    { 
     MessageBox(NULL, 
        L"The FX file cannot be located. Please run this executable from the directory that contains the FX file.", L"Error", MB_OK); 
     return hr; 
    } 

    // Obtain the technique 
    g_pTechnique = g_pEffect->GetTechniqueByName("Render"); 

    // Define the input layout 
    D3D10_INPUT_ELEMENT_DESC layout[] = 
    { 
     { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, 
    }; 
    UINT numElements = sizeof(layout)/sizeof(layout[0]); 

    // Create the input layout 
    D3D10_PASS_DESC PassDesc; 
    g_pTechnique->GetPassByIndex(0)->GetDesc(&PassDesc); 
    hr = g_pd3dDevice->CreateInputLayout(layout, numElements, PassDesc.pIAInputSignature, 
              PassDesc.IAInputSignatureSize, &g_pVertexLayout); 
    if(FAILED(hr)) 
     return hr; 

    // Set the input layout 
    g_pd3dDevice->IASetInputLayout(g_pVertexLayout); 

    // Create vertex buffer 
    SimpleVertex vertices[] = 
    { 
     D3DXVECTOR3(0.0f, 0.5f, 0.5f), 
     D3DXVECTOR3(0.5f, -0.5f, 0.5f), 
     D3DXVECTOR3(-0.5f, -0.5f, 0.5f), 
    }; 
    D3D10_BUFFER_DESC bd; 
    bd.Usage = D3D10_USAGE_DEFAULT; 
    bd.ByteWidth = sizeof(SimpleVertex) * 3; 
    bd.BindFlags = D3D10_BIND_VERTEX_BUFFER; 
    bd.CPUAccessFlags = 0; 
    bd.MiscFlags = 0; 
    D3D10_SUBRESOURCE_DATA InitData; 
    InitData.pSysMem = vertices; 
    hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pVertexBuffer); 
    if(FAILED(hr)) 
     return hr; 

    // Set vertex buffer 
    UINT stride = sizeof(SimpleVertex); 
    UINT offset = 0; 
    g_pd3dDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); 

    // Set primitive topology 
    g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 

    return S_OK; 
} 


//-------------------------------------------------------------------------------------- 
// Clean up the objects we've created 
//-------------------------------------------------------------------------------------- 
void CleanupDevice() 
{ 
    if(g_pd3dDevice) g_pd3dDevice->ClearState(); 

    if(g_pVertexBuffer) g_pVertexBuffer->Release(); 
    if(g_pVertexLayout) g_pVertexLayout->Release(); 
    if(g_pEffect) g_pEffect->Release(); 
    if(g_pRenderTargetView) g_pRenderTargetView->Release(); 
    if(g_pSwapChain) g_pSwapChain->Release(); 
    if(g_pd3dDevice) g_pd3dDevice->Release(); 
} 


//-------------------------------------------------------------------------------------- 
// Called every time the application receives a message 
//-------------------------------------------------------------------------------------- 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    PAINTSTRUCT ps; 
    HDC hdc; 

    switch(message) 
    { 
     case WM_PAINT: 
      hdc = BeginPaint(hWnd, &ps); 
      EndPaint(hWnd, &ps); 
      break; 

     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 

     default: 
      return DefWindowProc(hWnd, message, wParam, lParam); 
    } 

    return 0; 
} 


//-------------------------------------------------------------------------------------- 
// Render a frame 
//-------------------------------------------------------------------------------------- 
void Render() 
{ 
    // Clear the back buffer 
    float ClearColor[4] = { 0.0f, 0.125f, 0.3f, 1.0f }; // red,green,blue,alpha 
    g_pd3dDevice->ClearRenderTargetView(g_pRenderTargetView, ClearColor); 

    // Render a triangle 
    D3D10_TECHNIQUE_DESC techDesc; 
    g_pTechnique->GetDesc(&techDesc); 
    for(UINT p = 0; p < techDesc.Passes; ++p) 
    { 
     g_pTechnique->GetPassByIndex(p)->Apply(0); 
     g_pd3dDevice->Draw(3, 0); 
    } 

    // Present the information rendered to the back buffer to the front buffer (the screen) 
    g_pSwapChain->Present(0, 0); 
} 

我是否需要安裝任何軟件,就像一個圖書館或東西,我只需要按照我不得不採取了直接X LIB文件相同的步驟?

http://www.rastertek.com/dx11tut01.html

+0

windows sdk ....你需要windows sdk才能編譯windows程序。確保安裝完Windows sdk之後,您將項目include和lib路徑指向也指向Windows sdk安裝目錄。 – johnathon

+0

我只需要安裝它嗎?或者我還必須「鏈接」它? –

+0

安裝它。你在什麼版本的窗戶上?看到我以前的評論。你必須告訴項目你在哪裏可以找到windows SDK。您正在閱讀的教程假定使用visual studio 2010 professional或更高版本。 Windows 7的windows sdk附帶專業版,您必須自行安裝和設置。它是一個免費的開發環境,可視化工作室編輯器和編譯器的所有漂亮功能,減去sdk。 – johnathon

回答

2
  1. 安裝Visual Studio快車C++。
  2. 安裝適用於Windows 7的Windows SDK。
  3. 在爲該副本+粘貼代碼重新創建新項目後,將項目屬性指向Windows sdk以及直接X sdk。這包括包含文件夾和lib文件夾。如果你不知道該怎麼做,請查看msdn.com上的「how do i」視頻,以獲取visual studio 2010.
  4. 編譯。
+0

錯誤錯誤LNK1104:無法打開文件'MSVCRTD.lib'\t C:\ Program Files(x86)\ Microsoft DirectX SDK(2010年6月) Samples \ C++ \ Direct3D10 \ Tutorials \ Tutorial02 \ LINK –

+0

我安裝了一個用於Windows Vista,現在得到這個錯誤。出於某種原因,我只有1個錯誤,這很奇怪。 –

+0

您是否按照上面概述的所有步驟操作?特別是2和3? – johnathon

0

我有一個非常類似的錯誤與Visual Studio 2013快報:

LINK : fatal error LNK1181: cannot open input file 'winmm.lib' 

對於我來說,原來我已經安裝了 '的Visual Studio 2013 Express Windows版',當我真正需要的「視覺Studio 2013 Express for Windows桌面「。

安裝'Visual Studio 2013 Express for Windows Desktop'爲我解決了這個錯誤。

相關問題