我在使用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。 我怎么能避免这个?有没有办法可以从我的项目中排除这些新库?
答案 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标头和库的正确顺序。
- 打开项目的属性,然后选择VC ++目录页面。
- 选择所有配置和所有平台。
如下设置这些目录:
- 包含目录:$(IncludePath); $(DXSDK_DIR)包含
- 图书馆目录:$(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;但是,此警告表示您正在使用这些标头的旧版本。
℃。删除项目中对DXGIType.h的所有引用。 Windows SDK中不存在此标头,并且DirectX SDK版本与新的winerror.h冲突。
d。所有D3DX DLL都通过DirectX SDK安装安装到您的开发计算机上。确保必要的D3DX依赖项与任何样本或应用程序一起重新分发,如果它被移动到另一台机器上。
即请注意,D3DX11当前使用的替代技术包括DirectXTex和DirectXTK。 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为我工作。