C++ directx标头和winerror.h之间的宏定义冲突
我正在使用Visual Studio 2012安装windows 7 当我编译时,我得到了很多宏重新定义警告,这些警告是由winerror.h和dxgi.h、dxgitype.h、d3d11.h、d3d10.h引起的;例如,DXGI_状态_遮挡、DXGI_状态_剪裁、DXGI_状态_无重定向等 我想这是因为安装了WindowsSDK8。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 事实上,我想忽略它,
我怎样才能避免这种情况?有什么方法可以从我的项目中排除这些新库吗?我更改了设置,并从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头和库使用正确的顺序
- 包含目录:$(IncludePath)$(DXSDK_DIR)包括
- 库目录:$(LibraryPath)$(DXSDK_DIR)Lib\x86
- 库目录:$(LibraryPath)$(DXSDK_DIR)Lib\x64
我不能肯定,但我认为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目录