在Visual Studio 2012中调用D3DReadFileToBlob会导致链接错误

时间:2013-02-13 18:33:59

标签: visual-studio-2012 directx directx-11

我在DirectX项目中加载预编译的HLSL着色器时遇到了令人沮丧的问题。我正在使用Visual Studio 2012 Professional和DirectX SDK(2010年6月)。下面的代码导致链接错误LNK2019:未解析的外部符号_D3DReadFileToBlob @ 8。

#include "GameBase.h"
#include<D3Dcompiler.h>

bool GameBase::LoadShaderFromFile(LPCWSTR filePath, ID3DBlob** buffer)
{
    HRESULT result = D3DReadFileToBlob(filePath, buffer);

    if(FAILED(result))
    {
        return false;
    }

    return true;
}

库d3d11.lib; d3dx11.lib; dxerr.lib; D3dcompiler.lib在链接器&gt;中设置。输入&gt;其他依赖项,以及为DirectX SDK位置设置正确的包含目录和库目录:$(IncludePath); $(DXSDK_DIR)包含,$(LibraryPath); $(DXSDK_DIR)Lib \ x86)。

删除这部分代码允许项目的其余部分编译和运行而不会发生事故(明显的例外是着色器不加载)。

我觉得我必须遗漏一些微妙的东西,但我通过搜索和Stack Overflow找到的任何内容都没有提供任何有关如何解决此问题的见解。

3 个答案:

答案 0 :(得分:1)

您的问题是您正在混合Windows 8.x SDK和DirectX SDK,使得您使用不支持D3DReadFileToBlob的旧版版本的D3DCompile。

如果将VS2012 / Windows 8.0 SDK或VS2013 / Windows 8.1 SDK与旧版DirectX SDK结合使用,则需要修改include / lib路径以获得“正确”行为。这在MSDN详细介绍。

您还应该阅读有关D3DCompile,DLL部署和版本控制的blog条目。

答案 1 :(得分:0)

也许你的混合库与windows 8 sdk也有这些库。更改链接设置以查看包含的库并验证d3dcompiler.lib的来源,或者是否链接到它。

答案 2 :(得分:0)

因此,如果使用Windows Kit,则不能再包含d3dx11.lib,但是可以包含d3dcompiler.lib(通常可以在其中找到) C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64或您使用的任何内部版本