Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ directx标头和winerror.h之间的宏定义冲突_C++_Visual Studio 2012_Directx 11_Winapi - Fatal编程技术网

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

C++ directx标头和winerror.h之间的宏定义冲突,c++,visual-studio-2012,directx-11,winapi,C++,Visual Studio 2012,Directx 11,Winapi,我正在使用Visual Studio 2012安装windows 7 当我编译时,我得到了很多宏重新定义警告,这些警告是由winerror.h和dxgi.h、dxgitype.h、d3d11.h、d3d10.h引起的;例如,DXGI_状态_遮挡、DXGI_状态_剪裁、DXGI_状态_无重定向等 我想这是因为安装了WindowsSDK8。 我怎样才能避免这种情况?有什么方法可以从我的项目中排除这些新库吗?我更改了设置,并从Windows Kits\8.0中包括了directx 事实上,我想忽略它,

我正在使用Visual Studio 2012安装windows 7

当我编译时,我得到了很多宏重新定义警告,这些警告是由winerror.h和dxgi.h、dxgitype.h、d3d11.h、d3d10.h引起的;例如,DXGI_状态_遮挡、DXGI_状态_剪裁、DXGI_状态_无重定向等

我想这是因为安装了WindowsSDK8。
我怎样才能避免这种情况?有什么方法可以从我的项目中排除这些新库吗?

我更改了设置,并从Windows Kits\8.0中包括了directx

事实上,我想忽略它,使用我以前使用过的windows标题和库,但可能没有多大区别


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

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

我在Windows 8上使用Visual Studio 2012 Express时遇到此问题;但是,我的错误几乎完全相同,修复的中心是Windows SDK:

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

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

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

  • 打开项目的属性并选择VC++目录页面

  • 选择所有配置和所有平台

  • 按如下方式设置这些目录:

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

  • 选择x64平台

  • 按如下方式设置库目录:

    • 库目录:$(LibraryPath)$(DXSDK_DIR)Lib\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替换技术包括和。D3DXMath被替换为


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

    另一个快速修复程序,如“可能不是最佳长期解决方案”中的快速修复程序,是更改“平台工具集”在解决方案/属性/常规-在我的具体案例中,我选择了“Visual Studio 2015-Windows XP(v140_XP)”而不是“Visual Studio 2015(v140)”。

    (是的,我对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>
    
    //D3D11 NoRedefs.h
    //包括D3D11.h,无需从Windows重新定义!
    #布拉格语一次
    #包括
    #pragma区域取消定义Windows宏
    //如果尚未包含DXGIType.h,则仅取消定义
    #ifndef\uuu dxgitype\u h__
    #未定义DXGI_状态_被遮挡
    #未定义DXGI\u状态\u已剪裁
    #未定义DXGI\u状态\u无\u重定向
    #未定义DXGI\u状态\u无\u桌面\u访问
    #未定义DXGI\u状态\u图形\u视频\u源\u正在使用
    #未定义DXGI\u状态\u模式\u已更改
    #未定义DXGI\u状态\u模式\u更改\u进行中
    #undef DXGI\u错误\u无效\u调用
    #未定义DXGI\u错误\u未找到
    #未定义DXGI\u错误\u更多\u数据
    #未定义DXGI\u错误\u不受支持
    #未定义DXGI\u错误\u设备\u已删除
    #未定义DXGI错误设备挂起
    #未定义DXGI错误设备重置
    #未定义DXGI\u错误\u仍在\u绘图
    #未定义DXGI错误帧统计不相交
    #未定义DXGI错误图形视频源使用中
    #未定义DXGI错误驱动程序内部错误
    #未定义DXGI\u错误\u非独占
    #未定义DXGI错误\u当前不可用\u
    #未定义DXGI\u错误\u远程\u客户端\u断开连接
    #未定义DXGI\u错误\u远程\u OUTOFMEMORY
    #未定义D3D11\u错误\u太多\u唯一\u状态\u对象
    #未定义D3D11\u错误\u未找到文件\u
    #未定义D3D11\u错误\u太多\u唯一\u视图\u对象
    #未定义D3D11\u错误\u延迟\u上下文\u映射\u没有\u初始\u放弃
    #未定义D3D10\u错误\u太多\u唯一\u状态\u对象
    #未定义D3D10\u错误\u未找到文件\u
    #恩迪夫
    #布拉格端区
    #包括
    

    请让我知道你的想法,不要保留批评意见。我不熟悉这一点,知道这是一种蛮力,可能有风险。

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

    按照user2400203的回答,并重命名C:\Program Files(x86)\Microsoft目录