DirectX CMake включает в себя break Windows.h

#c #windows #cmake #compiler-errors #directx

#c #Windows #cmake #ошибки компилятора #directx

Вопрос:

Когда я пытаюсь включить каталог DirectX SDK в свой проект с помощью CMake, файлы заголовков в windows.h выдают ошибки при попытке #include <windows.h> (заголовок directx ранее не включался).

команды, которые я использую для генерации / компиляции:

 cmake -S . -B build -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug
cd build
nmake
 

CMakeLists.txt

 cmake_minimum_required(VERSION 3.0)

project( NisPaper )

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
IF( EXISTS "${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json" )
   EXECUTE_PROCESS( COMMAND ${CMAKE_COMMAND} -E copy_if_different
   ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json
   ${CMAKE_CURRENT_SOURCE_DIR}/compile_commands.json
)
ENDIF()

ADD_LIBRARY(NisPaperLibs
    gdimanager.cpp
    gdirenderer.cpp
    d3dmanager.cpp
    winmanager.cpp
    d3drenderer.cpp
)

add_executable( NisPaper main.cpp )
target_link_libraries(NisPaper NisPaperLibs)

target_link_libraries(NisPaper gdiplus.lib)
target_link_libraries(NisPaper gdi32.lib)
target_link_libraries(NisPaper user32.lib)
target_link_libraries(NisPaper Dwmapi.lib)

find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
target_link_libraries( NisPaper ${OpenCV_LIBS} )

#This line causes the errors
include_directories("C:/Program Files (x86)/Microsoft DirectX SDK (March 2008)/Include")
 

ошибки:

 C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidlbase.h(6184): error C2061: syntax error: identifier '__RPC__out_xcount_part'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidlbase.h(6188): error C2061: syntax error: identifier '__RPC__in_xcount_full'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidlbase.h(6392): error C2061: syntax error: identifier '__RPC__out_xcount_part'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidlbase.h(6396): error C2061: syntax error: identifier '__RPC__in_xcount_full'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidlbase.h(6600): error C2061: syntax error: identifier '__RPC__out_xcount_part'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidlbase.h(6604): error C2061: syntax error: identifier '__RPC__in_xcount_full'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidl.h(14536): error C2061: syntax error: identifier '__RPC__inout_xcount'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidl.h(14537): error C2061: syntax error: identifier '__RPC__in_xcount'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidl.h(14541): error C2061: syntax error: identifier '__RPC__inout_xcount'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidl.h(14542): error C2061: syntax error: identifier '__RPC__in_xcount'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidl.h(14546): error C2061: syntax error: identifier '__RPC__inout_xcount'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidl.h(14547): error C2061: syntax error: identifier '__RPC__in_xcount'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidl.h(14551): error C2061: syntax error: identifier '__RPC__inout_xcount'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidl.h(14552): error C2061: syntax error: identifier '__RPC__in_xcount'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidl.h(14556): error C2061: syntax error: identifier '__RPC__inout_xcount'
C:Program Files (x86)Windows Kits10include10.0.19041.0umobjidl.h(14557): error C2061: syntax error: identifier '__RPC__in_xcount'
 

И многое другое…

Я думал, что это произойдет, потому что DirectX включает переопределение чего-либо, когда они загружаются до и / или имеют приоритет над заголовками Windows, поэтому я попытался заменить строку одним из них:

 include_directories(BEFORE "C:/Program Files (x86)/Microsoft DirectX SDK (March 2008)/Include")
include_directories(AFTER "C:/Program Files (x86)/Microsoft DirectX SDK (March 2008)/Include")
include_directories(BEFORE SYSTEM "C:/Program Files (x86)/Microsoft DirectX SDK (March 2008)/Include")
include_directories(AFTER SYSTEM "C:/Program Files (x86)/Microsoft DirectX SDK (March 2008)/Include")
 

но ничего не изменилось.
Я также пытался включить windows.h после некоторых заголовков DirectX, таких как d3d11.h d3dcompiler.h d3dcomm.h и т.д. надеясь, что это что-то сделает, но, как и ожидалось, ничего не изменилось.
Я был бы очень признателен за помощь, потому что я действительно не знаю, как я должен это исправить…

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

1. Связанные: social.msdn.microsoft.com/Forums/windows/en-US /…

2. спасибо, мне вроде как удалось это исправить, добавив include_directories(«C:/Program Files (x86) / Windows Kits / 10/Include /10.0.19041.0 / shared») перед включением directx, но мой плагин automplete / syntax (coc-clangd), который использует сгенерированный файл compile_commands.json, по-прежнему указывает, чтоошибка существует, я чувствую, что это неправильный способ сделать это…

Ответ №1:

Проблема в том, что устаревший DirectX SDK содержит ряд устаревших заголовков, которые конфликтуют с Windows SDK. В этом случае, когда вы включили Windows.h его, он пришел из Windows SDK, но затем, когда этот заголовок искал rcpsal.h , он извлек древнюю копию из устаревшего DirectX SDK.

Порядок включения заголовка / библиотеки помогает, если вы помещаете DXSDK в конец, но еще лучшим решением является (а) вообще не использовать устаревший DirectX SDK в этом сообщении в блоге или (б), если вы должны его использовать, обрезать в этом сообщении в блоге.

Смотрите также, где находится DirectX SDK (издание 2021 года)?.

Версия VCPkg порта directxsdk поддерживает «урезанную» версию. Смотрите этот PR.

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

1. Большое вам спасибо, я не знал, что D3DX устарел, я просто продолжу без них, если они не нужны.