我在使用 Visual Studio 2012 的 Windows 7 上。
当我编译时,我收到很多由 winerror.h 与 dxgi.h、dxgitype.h、d3d11.h、d3d10.h 引起的宏重新定义警告;例如 DXGI_STATUS_OCCLUDED、DXGI_STATUS_CLIPPED、DXGI_STATUS_NO_REDIRECTION 等。
我想这是因为安装了 windows sdk 8。我怎样才能避免这种情况?有没有办法可以从我的项目中排除这些新库?
我在使用 Visual Studio 2012 的 Windows 7 上。
当我编译时,我收到很多由 winerror.h 与 dxgi.h、dxgitype.h、d3d11.h、d3d10.h 引起的宏重新定义警告;例如 DXGI_STATUS_OCCLUDED、DXGI_STATUS_CLIPPED、DXGI_STATUS_NO_REDIRECTION 等。
我想这是因为安装了 windows sdk 8。我怎样才能避免这种情况?有没有办法可以从我的项目中排除这些新库?
我在 Windows 8 上使用 Visual Studios 2012 编译 SlimDX 时遇到了这个问题。Windows SDK 包含默认继承,因此它们在手动定义的项目包含目录后加载。要修复它,请将 Windows SDK 添加为第一个包含目录。 $(WindowsSDK_IncludePath)
我在 Windows 8 上使用 Visual Studio 2012 Express 遇到了这个问题;但是,我的错误几乎完全相同,并且修复以 Windows SDK 为中心。这是在 MSDN 中(参见 #5):
D3DX 不被视为在 Windows 8 中使用 Direct3D 的规范 API,因此不包含在相应的 Windows SDK 中。研究使用 Direct3D API 的替代解决方案。
对于旧项目,例如 Windows 7(和更早版本)DirectX SDK 示例,以下步骤对于使用 DirectX SDK 构建具有 D3DX 的应用程序是必需的:
一种。如下修改项目的 VC++ 目录,以使用正确的 SDK 头文件和库顺序。
打开项目的属性并选择 VC++ 目录页面。
选择所有配置和所有平台。
如下设置这些目录:
- 包含目录:$(IncludePath);$(DXSDK_DIR)Include
- 库目录:$(LibraryPath);$(DXSDK_DIR)Lib\x86
单击应用。
选择 x64 平台。
如下设置库目录:
- 库目录:$(LibraryPath);$(DXSDK_DIR)Lib\x64
湾。无论您的项目中包含“d3dx9.h”、“d3dx10.h”还是“d3dx11.h”,请务必明确包含“d3d9.h”、“d3d10.h”和“dxgi.h”,或“ d3d11.h" 和 "dxgi.h" 首先确保您选择的是较新的版本。如果需要,您可以禁用警告 C4005;但是,此警告表明您正在使用这些标头的旧版本。
C。删除项目中对 DXGIType.h 的所有引用。Windows SDK 中不存在此标头,并且 DirectX SDK 版本与新的 winerror.h 冲突。
d。所有 D3DX DLL 都通过 DirectX SDK 安装安装到您的开发计算机上。确保必要的 D3DX 依赖项与任何示例或您的应用程序(如果它被移动到另一台机器)一起重新分发。
e. 请注意,当前使用 D3DX11 的替代技术包括DirectXTex和DirectXTK。D3DXMath 被DirectXMath取代。
我不能肯定地说,但我认为 Windows 8 SDK 可能是你的问题。这可能有点痛苦,但使用上面的修复将有助于减少您的代码需要的依赖项,并使其与 Windows 7 和 Windows 8 兼容。
(是的,我在 Stackoverflow 上的第一个答案)
找到了一个希望好的解决方法:制作自己的头文件,包括 Windows.h(D3D11 无论如何都包括),取消定义 Windows 宏并包括 D3D11.h。包括此标头而不是 D3D11.h。注意:显然这优先于 D3D11 版本的定义,而不是那些 Windows.h
// D3D11-NoRedefs.h
// Includes D3D11.h without redefinitions from Windows!
#pragma once
#include <Windows.h>
#pragma region Undefine Windows Macros
// Only undefine, if DXGIType.h has not been included yet
#ifndef __dxgitype_h__
#undef DXGI_STATUS_OCCLUDED
#undef DXGI_STATUS_CLIPPED
#undef DXGI_STATUS_NO_REDIRECTION
#undef DXGI_STATUS_NO_DESKTOP_ACCESS
#undef DXGI_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE
#undef DXGI_STATUS_MODE_CHANGED
#undef DXGI_STATUS_MODE_CHANGE_IN_PROGRESS
#undef DXGI_ERROR_INVALID_CALL
#undef DXGI_ERROR_NOT_FOUND
#undef DXGI_ERROR_MORE_DATA
#undef DXGI_ERROR_UNSUPPORTED
#undef DXGI_ERROR_DEVICE_REMOVED
#undef DXGI_ERROR_DEVICE_HUNG
#undef DXGI_ERROR_DEVICE_RESET
#undef DXGI_ERROR_WAS_STILL_DRAWING
#undef DXGI_ERROR_FRAME_STATISTICS_DISJOINT
#undef DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE
#undef DXGI_ERROR_DRIVER_INTERNAL_ERROR
#undef DXGI_ERROR_NONEXCLUSIVE
#undef DXGI_ERROR_NOT_CURRENTLY_AVAILABLE
#undef DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED
#undef DXGI_ERROR_REMOTE_OUTOFMEMORY
#undef D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS
#undef D3D11_ERROR_FILE_NOT_FOUND
#undef D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS
#undef D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD
#undef D3D10_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS
#undef D3D10_ERROR_FILE_NOT_FOUND
#endif
#pragma endregion
#include <D3D11.h>
请让我知道您的想法,不要拒绝批评。我对此并不陌生,并且知道这是相当蛮力的并且可能有风险。
我更改了设置并从 Windows Kits\8.0 中包含了 directx。
实际上我想忽略它并使用我之前使用的 Windows 头文件和库,但也许它并没有太大的区别。
唯一的问题是,现在我无法再访问 d3dx 实用程序了。
另一个快速修复 - 快速,如“可能不是最好的长期解决方案” - 是更改解决方案/属性/常规下的“平台工具集” - 在我的具体情况下,我选择了“Visual Studio 2015 - Windows XP (v140_xp )”而不是“Visual Studio 2015 (v140)”。
Winerror.h 包括 DXGIType.h,Visual Studio 发现 DirectX SDK DXGIType.h 而不是 Windows SDK 之一。
按照 user2400203 的回答,重命名 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\DXGIType.h 对我有用。