【问题标题】:Macro definition clash between directx headers and winerror.hdirectx 头文件和 winerror.h 之间的宏定义冲突
【发布时间】:2012-09-30 16:51:40
【问题描述】:

我在 Windows 7 上使用 Visual Studio 2012。

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

我想这是因为安装了 windows sdk 8。 我怎样才能避免这种情况?有没有办法可以从我的项目中排除这些新库?

【问题讨论】:

  • 请分享包含的顺序。另外为什么要在同一个文件包含结构中使用 d3d10 和 d3d11 ?
  • @Ram,d3d10 包含在 d3d11 的某些部分中。
  • 我尝试删除除 d3d11.h 之外的所有内容,其中包括 dxgi.h 和 dxgitype.h
  • 您正在混合来自不同 SDK 版本的标头。不要那样做。
  • 我只包括 windows.h 和 d3d11.h

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


【解决方案1】:

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

【讨论】:

  • 谢谢,我遵循了一些更复杂的指令。这些正是我所需要的!
  • 也许删除对 DirectX SDK 的引用是正确的方法,但这个解决方案是如此快速和简洁。 ^^
【解决方案2】:

我在 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. 如下设置这些目录:

    • 包含目录:$(IncludePath);$(DXSDK_DIR)Include
    • 库目录:$(LibraryPath);$(DXSDK_DIR)Lib\x86
  4. 点击应用。

  5. 选择 x64 平台。

  6. 如下设置库目录:

    • 库目录:$(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 的替代技术包括 DirectXTexDirectXTK。 D3DXMath 替换为DirectXMath

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

【讨论】:

  • 感谢您的广泛回答。自从我切换到 windows8 后,我从头开始编写所有内容,所以我没有遇到任何问题。幸运的是,用 DirectXTK 和 FW1FontWrapper 替换 d3dx 很容易。我会将其标记为已接受的答案,这对遇到相同问题的人很有用。
【解决方案3】:

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

请让我知道您的想法,不要拒绝批评。我是新手,我知道这是蛮力的,可能有风险。

【讨论】:

  • 只是一个错字:如果你注释掉#pragma region Undefine Windows Macros 行,你也应该注释掉#pragma endregion 行。或者从第一个 pragma 中删除 //..
  • 谢谢@Michael。 #pragma 区域已取消注释。对于除 Visual Studio 之外的 IDE 的任何用户:请记住,#pragma 区域是一个 VS 命令,可能会尝试在其他 IDE 中编译为代码。它只是一个用于折叠代码块并帮助结构的命令
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      Winerror.h 包含 DXGIType.h,Visual Studio 发现 DirectX SDK DXGIType.h 而不是 Windows SDK 之一。

      按照 user2400203 的回答,重命名 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\DXGIType.h 对我有用。

      【讨论】:

        猜你喜欢
        • 2022-01-14
        • 1970-01-01
        • 2011-07-03
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多