【问题标题】:Linker issue calling the D3DX10CreateEffectFromFile() method调用 D3DX10CreateEffectFromFile() 方法的链接器问题
【发布时间】:2010-06-27 02:27:39
【问题描述】:

在尝试为 directX 检索效果文件时遇到问题。如果我不包含 D3DX10CreateEffectFromFile() 方法,则应用程序编译正确。如果我确实包括它。我收到以下错误

1>GXDX.obj : error LNK2019: unresolved external symbol _D3DX10CreateEffectFromFileW@48 referenced in function "public: virtual void __thiscall GXDX::StartUp(struct HWND__ * *,int,int)" (?StartUp@GXDX@@UAEXPAPAUHWND__@@HH@Z)
1>C:\Users\numerical25\Desktop\Intro ToDirectX\GODFILES\GXRenderManager\GXRenderManager\Debug\GXRenderManager.exe : fatal error LNK1120: 1 unresolved externals

我的第一个想法是它可能没有正确链接directx 库。但我发现这是关闭的,因为我包含了 lib 文件并且我正在使用其他方法没有问题。下面是我的代码。

头文件

#ifndef GXDX_
#define GXDX_

#include "GXRenderer.h"
#include <d3d10.h>
#include <d3dx10.h>
#include "GXExceptions.h"


#pragma comment (lib, "d3d10.lib")
#pragma comment (lib, "d3dx10.lib")

class GXDX: public GXRenderer {
protected:
    ID3D10Device* gm_dxDevice;
    IDXGISwapChain* gm_swapChain;
    ID3D10RenderTargetView* gm_renderTargetView;
    ID3D10Effect *gm_shader;
    ID3D10EffectTechnique *gm_tech;
public:
    void CleanUp();
    void StartUp(HWND* window,int w, int h);
    void SetupScene();
    void DisplayScene();
    void LoadMesh(GXVector*,UINT*);
    void DrawText(LPSTR);
};

#endif

下面是实现

void GXDX::StartUp(HWND* mainWindow,int w, int h)
{
    width = w;
    height = h;
    this->m_mainWindow = mainWindow;

    //Get size of window
    RECT rectangle;
    GetClientRect(*m_mainWindow,&rectangle);

    ID3D10Texture2D *backBufferSurface;

    DXGI_SWAP_CHAIN_DESC swapChainDesc;
    
    SecureZeroMemory(&swapChainDesc, sizeof(swapChainDesc));

    swapChainDesc.BufferCount = 2;
    swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
    swapChainDesc.BufferDesc.Width = width;
    swapChainDesc.BufferDesc.Height = height;
    swapChainDesc.SampleDesc.Count = 1;
    swapChainDesc.SampleDesc.Quality = 0;
    swapChainDesc.OutputWindow = *mainWindow;
    swapChainDesc.Windowed = TRUE;
    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 

    D3D10_DRIVER_TYPE driverType = D3D10_DRIVER_TYPE_HARDWARE;

    HRESULT hr = D3D10CreateDeviceAndSwapChain(NULL,driverType,NULL,0,
        D3D10_SDK_VERSION, &swapChainDesc,&gm_swapChain,&gm_dxDevice);

    if(FAILED(hr))
        throw GXVideoException(L"Problems retrieving directX device");

    hr = gm_swapChain->GetBuffer(0,__uuidof(ID3D10Texture2D), (LPVOID*)&backBufferSurface);

    if(FAILED(hr))
        throw GXVideoException(L"Failure to retrieve buffer from swap chain");

    hr = gm_dxDevice->CreateRenderTargetView(backBufferSurface, NULL,&gm_renderTargetView); 
    backBufferSurface->Release();

    if(FAILED(hr))
        throw GXVideoException(L"Failure to create Render Target View");
    

    //In the future, you might want to change this to something that allows multiple views
    //Like for an editor
    gm_dxDevice->OMSetRenderTargets(1, &gm_renderTargetView, NULL);

    UINT rectangle_width = rectangle.right - rectangle.left;
    UINT rectangle_height = rectangle.bottom - rectangle.top;

    D3D10_VIEWPORT viewport;

    viewport.TopLeftX = 0; 
    viewport.TopLeftY = 0;
    viewport.Width = rectangle_width;
    viewport.Height = rectangle_height;
    viewport.MinDepth = 0.0f;
    viewport.MaxDepth = 1.0f;

    //bind viewport
    gm_dxDevice->RSSetViewports(1,&viewport);

    D3D10_INPUT_ELEMENT_DESC layout[] = 
    {
        {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA},
    };
    

    hr = D3DX10CreateEffectFromFile(L"shader.fx", NULL, NULL,
        "fx_4_0",D3D10_SHADER_DEBUG,0,gm_dxDevice,NULL,NULL, &gm_shader,NULL,NULL);// Error here and dont know why

}

【问题讨论】:

  • 您是否在 Tools\Options\Project and Solutions\VC++\Directories\Library 文件中包含 d3dx10.lib?
  • 如果我有 pragma cmets,我不应该这样做。我认为有两种方法可以做到这一点。将其包含在解决方案选项中,或使用 pragma cmets
  • 我认为您的杂注注释可以具有完整路径,也可以基于您设置的路径。由于您只是说文件名,请检查您的路径。

标签: c++ c visual-studio visual-c++ directx


【解决方案1】:

必须喜欢链接器错误。目前我主要使用 DX9,但我记得 DX11 开沟效果(但仍然可用)。不过,DX10 应该还是有的。然而,通过 d3dx10async.h 查看显示 CompileEffectFromFile 仍然在那里(2010 年 6 月 sdk)。我注意到 D3DX10CompileEffectFromFile 在 MSDN 中被列为弃用,D3DX10CompileFromFile 是它的替代品。仔细检查您的库链接并尝试使用 D3DX10CompileFromFile 函数(尽管理论上如果 CompileEffect 函数仍然完全存在并且库正确链接它应该工作)。

【讨论】:

  • 我没有使用 D3DX10CompileEffectFromFile 。我正在使用 D3DX10CreateEffectFromFile 。至于DX11开沟效果。我认为这很荒谬。如果他们继续那样跳来跳去。然后我认为他们需要放慢更新速度,并进行更好的批判性思维。
  • 此外,智能感知获取 CreateEffectFromFile,但不是 CompileEffectFromFile
  • 啊,我关于“编译”和“创建”的错误,对不起。我同意对于那些不是一直保持最新状态的人来说,不断变化的变化会让人感到困惑。我相信开发人员可以研究代码(如果需要,可以编译和使用)并创建自己的效果框架(无论如何都会发生),但这仍然有点痛苦。无论如何,很高兴你解决了你的问题。
  • DX11 不会放弃效果。相反,他们为您提供了效果系统的完整源代码,并让您随心所欲:)
【解决方案2】:

我猜问题是我没有在解决方案选项区域的一般下的其他 lib 目录中提供 lib 路径。我应该知道这一点,但它让我失望了,因为我在这个问题之前调用的任何其他方法都可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多