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

时间:2012-09-30 16:51:41

标签: c++ visual-studio-2012 directx-11 winapi

我在使用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。 我怎么能避免这个?有没有办法可以从我的项目中排除这些新库?

6 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:12)

我在Windows 8上使用Visual Studio 2012 Express遇到了这个问题;但是,我的错误几乎完全相同,修复程序以Windows SDK为中心。 This was in MSDN (see #5)

  

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

     

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

     

一个。按如下所示修改项目的VC ++目录,以使用SDK标头和库的正确顺序。

     
      
  1. 打开项目的属性,然后选择VC ++目录页面。
  2.   
  3. 选择所有配置和所有平台。
  4.   
  5. 如下设置这些目录:

         
        
    • 包含目录:$(IncludePath); $(DXSDK_DIR)包含
    •   
    • 图书馆目录:$(LibraryPath); $(DXSDK_DIR)Lib \ x86
    •   
  6.   
  7. 点击“应用”。
  8.   
  9. 选择x64平台。
  10.   
  11. 按如下方式设置库目录:

         
        
    • 图书馆目录:$(LibraryPath); $(DXSDK_DIR)Lib \ x64
    •   
  12.         

    湾无论您的项目中包含“d3dx9.h”,“d3dx10.h”或“d3dx11.h”,请务必明确包含“d3d9.h”,“d3d10.h”和“dxgi.h”,或“ d3d11.h“和”dxgi.h“首先确保你拿到新版本。如果需要,您可以禁用警告C4005;但是,此警告表示您正在使用这些标头的旧版本。

         

    ℃。删除项目中对DXGIType.h的所有引用。 Windows SDK中不存在此标头,并且DirectX SDK版本与新的winerror.h冲突。

         

    d。所有D3DX DLL都通过DirectX SDK安装安装到您的开发计算机上。确保必要的D3DX依赖项与任何样本或应用程序一起重新分发,如果它被移动到另一台机器上。

         

    即请注意,D3DX11当前使用的替代技术包括DirectXTexDirectXTK。 D3DXMath替换为DirectXMath

我不能肯定地说,但我认为Windows 8 SDK可能是你的问题。这可能有点痛苦,但使用上面的修复将有助于使您的代码需要更少的依赖性,并使其与Windows 7和Windows 8兼容。

答案 2 :(得分:1)

(是的,我在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>

请让我知道你的想法,不要谴责批评。我是新手,并且知道这是非常暴力的,可能有风险。

答案 3 :(得分:0)

我更改了设置,并在Windows Kits \ 8.0中包含了directx。

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

唯一的问题是现在我不再访问d3dx实用程序了。

答案 4 :(得分:0)

另一个快速修复 - 快速,可能不是最好的长期解决方案&#39; - 是改变&#34;平台工具集&#34;在解决方案/属性/常规下 - 在我的特定情况下,我选择了&#34; Visual Studio 2015 - Windows XP(v140_xp)&#34;而不是&#34; Visual Studio 2015(v140)&#34;。

答案 5 :(得分:0)

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

遵循user2400203的答案,并重命名C:\ Program Files(x86)\ Microsoft DirectX SDK(2010年6月)\ Include \ DXGIType.h为我工作。