-1

有人可以帮我解决这个错误吗?我已经链接到 d3d10.lib 和 d3dx10.lib。

我是 DirectX 的新手,我正在关注 wendy jones DirectX 10 教程

1>t1.obj:错误 LNK2019:未解析的外部符号 _D3D10CreateDeviceAndSwapChain@32 在函数“bool cdecl InitDirect3D(struct HWND *,int,int)”中引用 (?InitDirect3D@@YA_NPAUHWND__@@HH@Z) 1>C:\Users \Ehsan\Documents\Visual Studio 2010\Projects\DirectX\t1\Debug\t1.exe : 致命错误 LNK1120: 1 unresolved externals

源代码 :

// t1.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "windows.h"
#include "tchar.h"  
#include <d3d10.h>
#include <d3dx10.h>

// Global Variables:
HINSTANCE hInst; // global handle to hold the application instance
HWND wndHandle; // global variable to hold the window handle
int width = 640;
int height = 480;

// Direct3D global vars
ID3D10Device * pD3DDevice = NULL;
IDXGISwapChain * pSwapChain = NULL;
ID3D10RenderTargetView * pRenderTargetView = NULL;

// Forward declarations of functions included in this code module:
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
bool InitWindow( HINSTANCE hInstance, int width, int height );
void Render();
void ShutDownDirect3D();
bool InitDirect3D(HWND hWnd, int width, int height);



int APIENTRY _tWinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR    lpCmdLine,
    int       nCmdShow)
{


    // TODO: Place code here.
    MSG msg = {0};
    // Perform application initialization:
    if ( !InitWindow( hInstance, width, height ) )
    {
        return FALSE;
    }
    // called after creating the window
    if(!InitDirect3D(wndHandle, width, height))
    {
        return FALSE;
    }

    //hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_T1));

    // Main message loop:
    while (WM_QUIT != msg.message)
    {
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) == TRUE)
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        // Call the render function
        Render();
    }
    ShutDownDirect3D();
    return (int) msg.wParam;

}


bool InitWindow(HINSTANCE hInstance, int width, int height)
{
    WNDCLASSEX wcex;
    // Fill in the WNDCLASSEX structure. This describes how the window
    // will look to the system
    wcex.cbSize = sizeof(WNDCLASSEX); // the size of the structure
    wcex.style = CS_HREDRAW | CS_VREDRAW; // the class style
    wcex.lpfnWndProc = (WNDPROC)WndProc; // the window procedure callback
    wcex.cbClsExtra = 0; // extra bytes to allocate for this class
    wcex.cbWndExtra = 0; // extra bytes to allocate for this instance
    wcex.hInstance = hInstance; // handle to the application instance
    wcex.hIcon = 0; // icon to associate with the application
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW); // the default cursor to use
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // the background color
    wcex.lpszMenuName = NULL; // the resource name for the menu
    wcex.lpszClassName = TEXT("DirectXExample"); // the class name being created
    wcex.hIconSm = 0; // the handle to the small icon
    RegisterClassEx(&wcex);

    // Resize the window
    RECT rect = { 0, 0, width, height };
    AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
    // create the window from the class above

    wndHandle = CreateWindow(TEXT("DirectXExample"),
        TEXT("DirectXExample"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        rect.right - rect.left,
        rect.bottom - rect.top,
        NULL,
        NULL,
        hInstance,
        NULL);
    if (!wndHandle)
    {
        return false;
    }
    // Display the window on the screen
    ShowWindow(wndHandle, SW_SHOW);
    UpdateWindow(wndHandle);
    return true;
}

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND  - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    // Check any available messages from the queue
    switch (message)
    {
        // Allow the user to press the Escape key to end the application
    case WM_KEYDOWN:
        switch(wParam)
        {
            // Check if the user hit the Escape key
        case VK_ESCAPE:
            PostQuitMessage(0);
            break;
        }
        break;
        // The user hit the close button, close the application
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    // Always return the message to the default window procedure for furtherprocessing
    return DefWindowProc(hWnd, message, wParam, lParam);
}

/*******************************************************************
* InitDirect3D
* Initializes Direct3D
* Inputs - Parent window handle - HWND,
Window width - int
Window height - int
Updating the Code 31
* Outputs - true if successful, false if failed - bool
*******************************************************************/
bool InitDirect3D(HWND hWnd, int width, int height)
{
    // Create the clear the DXGI_SWAP_CHAIN_DESC structure
    DXGI_SWAP_CHAIN_DESC swapChainDesc;
    ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));

    // Fill in the needed values
    swapChainDesc.BufferCount = 1;
    swapChainDesc.BufferDesc.Width = width;
    swapChainDesc.BufferDesc.Height = height;
    swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    swapChainDesc.OutputWindow = hWnd;
    swapChainDesc.SampleDesc.Count = 1;
    swapChainDesc.SampleDesc.Quality = 0;
    swapChainDesc.Windowed = TRUE;

    // Create the D3D device and the swap chain
    HRESULT hr = D3D10CreateDeviceAndSwapChain(NULL,
        D3D10_DRIVER_TYPE_REFERENCE,
        NULL,
        0,
        D3D10_SDK_VERSION,
        &swapChainDesc,
        &pSwapChain,
        &pD3DDevice);

    // Error checking. Make sure the device was created
    if (hr != S_OK)
    {
        return false;
    }

    // Get the back buffer from the swapchain
    ID3D10Texture2D * pBackBuffer;
    hr = pSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*) &pBackBuffer);
    if (hr != S_OK)
    {
        return false;
    }

    // create the render target view
    hr = pD3DDevice->CreateRenderTargetView(pBackBuffer, NULL, &pRenderTargetView);

    // release the back buffer
    pBackBuffer->Release();

    // Make sure the render target view was created successfully
    if (hr != S_OK)
    {
        return false;
    }

    // set the render target
    pD3DDevice->OMSetRenderTargets(1, &pRenderTargetView, NULL);

    // create and set the viewport
    D3D10_VIEWPORT viewport;
    viewport.Width = width;
    viewport.Height = height;
    viewport.MinDepth = 0.0f;
    viewport.MaxDepth = 1.0f;
    viewport.TopLeftX = 0;
    viewport.TopLeftY = 0;

    pD3DDevice->RSSetViewports(1, &viewport);

    return true;
}

/*******************************************************************
* ShutdownDirect3D
* Closes down and releases the resources for Direct3D
34 Chapter 2 n Your First DirectX Program
* Inputs - void
* Outputs - void
*******************************************************************/
void ShutDownDirect3D()
{
    // release the rendertarget
    if(pRenderTargetView)
    {
        pRenderTargetView->Release();
    }

    // release the swapchain
    if(pSwapChain)
    {
        pSwapChain->Release();
    }

    // release the D3D Device
    if(pD3DDevice)
    {
        pD3DDevice->Release();
    }
}

/*******************************************************************
* Render
* All drawing happens in the Render function
* Inputs - void
* Outputs - void
*******************************************************************/
void Render()
{
    if (pD3DDevice != NULL)
    {
        // clear the target buffer
        pD3DDevice->ClearRenderTargetView(pRenderTargetView, D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f));

        // All drawing will go here.

        // display the next item in the swap chain
        pSwapChain->Present(0, 0);
    }
}
4

3 回答 3

0

你硬盘中的包含文件夹呢?

您需要通过您的包含进行此操作,并在 lib/86 中添加到库依赖项。

按照此链接中的步骤操作:http ://www.rastertek.com/dx10tut01.html

这将引导您完成设置 DirectX 的过程。最坏的情况发生了,你这样做了,你仍然会遇到同样的问题,你知道这不是链接器问题。现在有 4 个人告诉你它是。

此外,该站点也非常适合带您了解 DirectX。我强烈建议。

于 2011-10-06T21:03:14.747 回答
0

这是链接的问题,您是否在您的视觉工作室中添加了正确的库?

于 2011-07-05T13:29:12.703 回答
0

将 D3D10.lib 添加到链接器依赖项列表中。

于 2011-07-05T13:30:07.750 回答