如何在 Windows 7 上将 DirectX 11 与 Visual Studio 2015 工具集 v140 一起使用

How to use DirectX 11 with Visual Studio 2015 toolset v140 on Windows 7

我正在基于 DirectX 11 制作项目。之前,我一直在使用 Visual Studio 2012 和 v110 工具集开发它。然后我需要使用 C++ 11 标准,所以我决定将它移动到 Visual Studio 2015。我也在使用 Windows 7,并希望我的项目与这个平台兼容(所以我使用的是标准 Win 项目,不适用于通用平台。

这里我遇到了新的 VS 工具集 v140 的问题。由于使用 DirectX 11 2010 June SDK,我遇到了下一个编译错误:

1>C:\Program Files (x86)\Windows Kits.1\Include\shared\dxgi1_2.h(1271): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files (x86)\Windows Kits.1\Include\shared\dxgi1_2.h(1271): error C2143: syntax error: missing ',' before '*'
1>C:\Program Files (x86)\Windows Kits.1\Include\shared\dxgi1_2.h(1275): error C2061: syntax error: identifier 'DXGI_RGBA'

我也在使用 effects11 和 D3DX。所以我不得不用新的工具集重新编译 effects11。 D3DX 库怎么样 - 我知道不推荐使用它。在我看来,正是这个库导致了编译错误。

我还直接从 Windows 套件中检查了 DirectX 11 在一个新的清晰项目中的使用情况(在我的例子中它使用的是 8.1 套件)。它在没有 D3DX 库的情况下工作正常。

有没有办法同时使用D3DX库和Win Kits,才不会产生兼容性问题?或者我应该使用一些库而不是 D3DX(比如 DXTK)?

UPD

我已经尝试从我的项目和 D3DX11Tex 中排除 D3DX,并将其完全适应 Windows Kits.1\ + DirectXMath + DirectXTex(来自 Microsoft Git 的库)。下一个错误已经出现了6次:

1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xtree(2047): error C3848: expression having type 'const `anonymous-namespace'::StringCompare' would lose some const-volatile qualifiers in order to call 'bool `anonymous-namespace'::StringCompare::operator ()(PCHAR,PCHAR)'

包含xtree.h的目录自动包含在项目路径中。据我了解没关系。

导致此错误的代码如下:

bool _Compare(const key_type& _Left, const key_type& _Right) const
{   // compare key_type to key_type, with debug checks
    return (_DEBUG_LT_PRED(this->_Getcomp(), _Left, _Right));
}

所有 6 个错误都指向 xtree.h 中的代码。顺便说一下,我在许多 header 中包含了 d3d11.h,它们彼此 link 多次(就像 d3d11.h 不作为单个包含位于层次结构的顶部,但层次结构中的每个文件都包含 this header).

问题:这个文件用在什么地方(我没有直接include)?会不会是 link 问题之王?还是某些版本之间又发生了某种冲突(我不知道怎么回事,只是因为我不使用 Dx11 June 2010 SDK,并且不要尝试 link 一些不存在的 header就像 D3DX11Tex)?

解决方案: xtree.h 的问题在 self-defined 函子中 std::map 与 NON-constant operator() .因此将其更改为常量解决了所有 6 个错误。

关于DirectX 的问题...不幸的是,旧版本无法与新VS 一起使用。因此,正如答案和评论中提到的那样,根本不要使用 D3DX。感谢大家!

2010 年 6 月的 SDK 非常旧,并且与最新的 Windows 工具包冲突,如您所见。 Direct3DX 也已被弃用,并且不再对其进行任何实际工作。

Microsoft 在名为 dxtk 的 public GitHub 帐户上重写了其中的一部分。您可以考虑使用它。但是,您将无法让原始 D3DX 使用现代版本的 Windows SDK。

您的问题的解决方案是删除对 2010 年 6 月版 DirectX SDK 的依赖,并替换项目中使用已弃用功能的部分。作为替代,使用 dxtk 或您自己重写的功能。