directx标头和winerror.h之间的宏定义冲突

Macro definition clash between directx headers and winerror.h

本文关键字:之间 宏定义 冲突 winerror directx      更新时间:2023-10-16

我在使用Visual Studio 2012的windows 7上。

当我编译时,我收到了很多由winerror.h与dxgi.h、dxgitype.h、d3d11.h、d3d10.h引起的宏重新定义警告;例如DXGI_STATUS_OCCLUDED、DXGI_STSTATUS_CLIPPED、DXGI_STATUS_NO_DIRECTION等

我想这是因为安装了windows sdk 8。我该如何避免这种情况?有没有办法将这些新库从我的项目中排除?

我在Windows 8上使用Visual Studios 2012编译SlimDX时遇到了这个问题。默认情况下,Windows SDK包含是继承的,因此它们在手动定义的项目包含目录之后加载。若要修复此问题,请将Windows SDK添加为第一个包含目录。$(WindowsSDK_IncludePath)

我在Windows 8上使用Visual Studio 2012学习版时遇到了这个问题;然而,我的错误几乎完全相同,并且修复是围绕Windows SDK进行的。这是在MSDN(见#5):

D3DX不被视为在Windows 8中使用Direct3D的规范API,因此不包含在相应的Windows SDK中。研究使用Direct3D API的替代解决方案。

对于遗留项目,如Windows 7(及更早版本)DirectX SDK示例,使用DirectX SDK使用D3DX构建应用程序需要以下步骤:

a。按如下方式修改项目的VC++目录,以便对SDK头和库使用正确的顺序。

  1. 打开项目的"属性",然后选择"VC++目录"页面。

  2. 选择所有配置和所有平台。

  3. 将这些目录设置如下:

    • 包含目录:$(IncludePath)$(DXSDK_DIR)包括
    • 库目录:$(LibraryPath)$(DXSDK_DIR)库\x86
  4. 单击"应用"。

  5. 选择x64平台。

  6. 按如下方式设置库目录:

    • 库目录:$(LibraryPath)$(DXSDK_DIR)库\ x64

b。无论何时;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工具包\8.0中包含了directx。

事实上,我想忽略它,使用我以前使用的windows头文件和库,但也许它没有太大区别。

唯一的问题是,现在我再也无法访问d3dx实用程序了。

另一个快速的解决方案是更改"解决方案/属性/常规"下的"平台工具集",就像"可能不是最好的长期解决方案"一样,在我的特定情况下,我选择了"Visual Studio 2015-Windows XP(v140_XP)"而不是"Visual Studio 15(v140)"。

Winerror.h包含DXGIType.h,Visual Studio找到了DirectX SDK DXGIType.h.而不是Windows SDK。

按照用户2400203的回答,并重命名C:\Program Files(x86)\Microsoft DirectX SDK(2010年6月)\Include\DXGIType.h对我有效。