【问题标题】:how to include both wincodec.h and d3dx10.h (or d3dx11) files in my project如何在我的项目中同时包含 wincodec.h 和 d3dx10.h(或 d3dx11)文件
【发布时间】:2020-12-02 10:06:39
【问题描述】:

我尝试在我的项目中包含 wincodec.h,但如果我尝试编译它会出现错误,我的项目中没有任何其他头文件或 cpp 文件。

我的代码(经过编辑以便更容易理解问题):

#pragma comment (lib, "windowscodecs.lib")

//it doesn't matter if include here also the Windows.h

//[about the 1st EDIT] i don't include any d3dx (10 or 11) headers here! However the compiler still gives me errors!!!

#include <wincodec.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    return 0;
}

这是我得到的错误;

Error   C3646   'PixelFormat': unknown override specifier

Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int

Error   C2061   syntax error: identifier 'DXGI_JPEG_AC_HUFFMAN_TABLE' (same error also for DXGI_JPEG_DC_HUFFMAN_TABLE and DXGI_JPEG_QUANTIZATION_TABLE)

所有这些错误都来自 wincodec.h 文件。 我也尝试从链接器>输入>附加依赖项中包含库 windowscodecs.lib,但仍然有相同的错误,所以我从那里删除,现在我将它包含在源代码中。 任何人都知道我为什么会收到这些错误以及如何解决?

我使用 Visual Studio 2019 (v142)、windows sdk 10、iso c++ 17。 构建为版本,x64。 子系统:Windows(/SUBSYSTEM:WINDOWS)

第一次编辑: 我才发现问题! 在库目录中,我有这个路径:C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include,如果我删除它,它构建得很好。

现在的问题是那里没有这条路径,我不能使用 D3D 部分所需的 2 个标头:d3dx10.h 和 d3dx11.h。

现在知道如何解决这个问题了吗?

第二次编辑: 所以,我现在将图书馆目录更改为:$(VC_IncludePath);$(WindowsSDK_IncludePath);$(DXSDK_DIR)/include 只有这个错误消失了:Error C3646 'PixelFormat': unknown override specifier

【问题讨论】:

  • 尝试包含#include ,而不是#include
  • @SimonMourier 我试过了,但遇到了同样的错误。
  • @yournamehere 使用/std:c++17 或不使用#include &lt;windows.h&gt;,发布的代码构建良好,其余设置保留默认值。您的项目类型是什么,您是否覆盖了WINVER_WIN32_WINNT 等以针对特定(旧)版本的Windows?
  • @dxiv 我在哪里可以看到项目类型,如果我覆盖了 WINVER,_WIN32_WINNT?
  • 可能是视觉工作室被窃听或其他什么......事实上我可以在一个新项目中很好地构建它。很奇怪的问题

标签: c++ compiler-errors direct3d wic


【解决方案1】:

您遇到的基本问题是旧版 DirectX SDK 包含一些与 Windows SDK“重叠”的标头。对于适用于 Windows 7 及更早版本的 Visual Studio 2010 / Windows SDK,DirectX SDK 中的那些标头较新,但自从适用于 Windows 8 的 Windows SDK 以来,情况并非如此。VS 2019 v142 正在使用Windows 10 SDK (17763) 或更高版本。

Windows 8 SDK 和 Windows 10 SDK 已经包含大部分“DirectX”内容,包括最新的 DXGI、Direct3D 9、Direct3D 10、Direct3D 11、Direct3D 12 和 D3DCompiler 标头/库。

Windows 8 SDK 和 Windows 10 SDK包含 D3DX9、D3DX10 或 D3DX11 实用程序标头/库。这些组件已弃用。

要解决此问题,您需要:

(a) 确保 DXSDK 包含/库路径您的 VC++ 目录中的其他路径之后。

(b) 在包含旧版“d3dx10.h”或“d3dx11.h”标头之前明确包含 Direct3D 和 DXGI 标头。如果您依赖 'd3dx10.h' 或 'd3dx11.h' 标头,那么它将始终拉入 old 版本:

#include <dxgi.h>
#include <d3d10.h>
#include <d3d11.h>

#include <d3dx10.h>
#include <d3dx11.h>

Microsoft Docsthis blog post

理想情况下,您应该删除所有已弃用的 DirectX SDK,而根本不使用 D3DX10 或 D3DX11。您可以在here 上找到一堆开源替代品。

请注意,如果您使用 v141_xp 工具集来支持 Windows XP,它实际上使用的是 Windows 7.1A SDK,它 DirectX 被集成之前,在这种情况下,旧的 DirectX SDK 标头是'较新'。

更新:另一个使用 D3DX 库而不出现这些头冲突的选项是使用Microsoft.DXSDK.D3DX NuGet 包而不是旧版 DirectX SDK。理想情况下,您应该改用那些开源替代品,因为 D3DX9/10/11 仍然很旧。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多