#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 все еще довольно старый.