我在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找到的任何内容都没有提供任何有关如何解决此问题的见解。
答案 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
或您使用的任何内部版本