0

我在 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 在 Linker > Input > Additional Dependencies 中设置,并为 DirectX SDK 位置设置正确的包含目录和库目录:$(IncludePath);$ (DXSDK_DIR)Include 和 $(LibraryPath);$(DXSDK_DIR)Lib\x86) 分别。

删除这部分代码可以让项目的其余部分顺利编译和运行(除了不加载着色器的明显例外)。

我觉得我一定遗漏了一些微妙的东西,但我通过搜索和 Stack Overflow 没有找到任何关于如何解决这个问题的见解。

4

3 回答 3

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 部署和版本控制的博客文章。

于 2014-06-27T18:49:15.630 回答
0

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

于 2013-02-16T09:09:09.630 回答
0

因此d3dx11.lib,如果使用 Windows Kit,您将无法再包含,但您可以包含d3dcompiler.lib(通常)可以在其中找到的 C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64或正在使用的任何构建,

于 2019-12-17T22:48:11.983 回答