как включить оба файла wincodec.h и d3dx10.h (или d3dx11) в мой проект

#c #compiler-errors #direct3d #wic

#c #ошибки компилятора #direct3d #вик

Вопрос:

я пытаюсь включить 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.библиотека из компоновщика> Ввод> Дополнительные зависимости, но все еще имела те же ошибки, поэтому я удалил ее оттуда и теперь включаю ее здесь, в исходном коде.
Кто-нибудь знает, почему я получаю эти ошибки и как я могу это исправить?

Я использую Visual studio 2019 (v142), Windows sdk 10, iso c 17. Сборка как релиз, x64. Подсистема: Windows (/SUBSYSTEM:WINDOWS)

1-я ПРАВКА: я только что нашел проблему! В каталогах библиотеки у меня был такой путь: C:Program Files (x86) Microsoft DirectX SDK (июнь 2010) Include, если я его удалю, он будет собран нормально.

Теперь проблема в том, что без этого пути я не могу использовать 2 заголовка, которые мне нужны для части D3D: d3dx10.h и d3dx11.h.

Есть идеи, как решить эту проблему сейчас?

2-е РЕДАКТИРОВАНИЕ: Итак, теперь я изменил каталоги библиотеки на это: $(VC_IncludePath);$(WindowsSDK_IncludePath);$(DXSDK_DIR)/include и только эта ошибка исчезла: Ошибка C3646 ‘PixelFormat’: неизвестный спецификатор переопределения

Комментарии:

1. Попробуйте включить #include <windows.h>, а не #include <windowsx.h>

2. @SimonMourier я попробовал и получил те же ошибки.

3. @yournamehere Опубликованный код отлично работает с использованием или без #include <windows.h> использования /std:c 17 , а остальные настройки остаются по умолчанию. Каков тип вашего проекта, и вы переопределили WINVER и т.д., _WIN32_WINNT чтобы настроить таргетинг на определенную (более старую) версию Windows?

4. @dxiv где я могу увидеть тип проекта и, если я переопределил WINVER, _WIN32_WINNT?

5. возможно, Visual Studio прослушивается или что-то в этом роде… действительно, я могу создать его в новом проекте. Очень странная проблема

Ответ №1:

Основная проблема, с которой вы сталкиваетесь, заключается в том, что устаревший DirectX SDK содержит некоторые заголовки, которые «перекрываются» с Windows SDK. Для Visual Studio 2010 / Windows SDK для Windows 7 и более ранних версий эти заголовки в DirectX SDK были более новыми, но это неверно, поскольку Windows SDK для Windows 8. VS 2019 v142 использует Windows 10 SDK (17763) или более позднюю версию.

Windows 8 SDK и Windows 10 SDK уже содержат большую часть содержимого «DirectX», включая новейшие заголовки / библиотеки DXGI, Direct3D 9, Direct3D 10, Direct3D 11, Direct3D 12 и D3DCompiler.

SDK для Windows 8 и Windows 10 SDK не содержат заголовков / библиотек утилит D3DX9, D3DX10 или D3DX11. Эти компоненты устарели.

Чтобы обойти эту проблему, вам необходимо:

(a) убедитесь, что пути DXSDK include/libs находятся после других путей в ваших каталогах VC .

(b) явно включите заголовки Direct3D и DXGI перед включением устаревших заголовков ‘d3dx10.h’ или ‘d3dx11.h’. Если вы полагаетесь на заголовок ‘d3dx10.h` или ‘d3dx11.h’, то он всегда будет использоваться в старой версии:

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

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

 

Смотрите Документы Майкрософт и это сообщение в блоге

В идеале вы должны полностью отказаться от использования устаревшего DirectX SDK и вообще не использовать D3DX10 или D3DX11. Вы можете найти множество замен с открытым исходным кодом, перечисленных здесь.

Обратите внимание, что если вы используете v141_xp набор инструментов для поддержки Windows XP, это фактически использует Windows 7.1A SDK, который был до интеграции DirectX, и в этом случае устаревшие заголовки DirectX SDK являются «более новыми».

ОБНОВЛЕНИЕ: Другим вариантом использования библиотеки D3DX без этих конфликтов заголовков является использование Microsoft.Пакет DXSDK.D3DX NuGet вместо устаревшего DirectX SDK. В идеале вы бы перешли на эти замены с открытым исходным кодом, поскольку D3DX9 / 10 / 11 все еще довольно старый.