DirectX CMake 包括中断 Windows.h

Posted

技术标签:

【中文标题】DirectX CMake 包括中断 Windows.h【英文标题】:DirectX CMake includes break Windows.h 【发布时间】:2021-02-03 17:07:40 【问题描述】:

当我尝试使用 CMake 将 DirectX SDK 目录包含到我的项目中时,当我尝试 #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 Kits\10\include\10.0.19041.0\um\objidlbase.h(6184): error C2061: syntax error: identifier '__RPC__out_xcount_part'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidlbase.h(6188): error C2061: syntax error: identifier '__RPC__in_xcount_full'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidlbase.h(6392): error C2061: syntax error: identifier '__RPC__out_xcount_part'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidlbase.h(6396): error C2061: syntax error: identifier '__RPC__in_xcount_full'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidlbase.h(6600): error C2061: syntax error: identifier '__RPC__out_xcount_part'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidlbase.h(6604): error C2061: syntax error: identifier '__RPC__in_xcount_full'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidl.h(14536): error C2061: syntax error: identifier '__RPC__inout_xcount'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidl.h(14537): error C2061: syntax error: identifier '__RPC__in_xcount'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidl.h(14541): error C2061: syntax error: identifier '__RPC__inout_xcount'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidl.h(14542): error C2061: syntax error: identifier '__RPC__in_xcount'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidl.h(14546): error C2061: syntax error: identifier '__RPC__inout_xcount'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidl.h(14547): error C2061: syntax error: identifier '__RPC__in_xcount'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidl.h(14551): error C2061: syntax error: identifier '__RPC__inout_xcount'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidl.h(14552): error C2061: syntax error: identifier '__RPC__in_xcount'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidl.h(14556): error C2061: syntax error: identifier '__RPC__inout_xcount'
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\objidl.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")

但没有任何改变。 我还尝试在 d3d11.h d3dcompiler.h d3dcommon.h 等一些 directX 标头之后包含 windows.h,希望它会做一些事情,但正如预期的那样,没有任何改变。 我真的很感激一些帮助,因为我真的不知道我应该如何解决这个问题......

【问题讨论】:

相关:social.msdn.microsoft.com/Forums/windows/en-US/… 谢谢,我设法通过在 directx 包含之前添加 include_directories("C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/shared") 来修复它,但是我的自动完成/语法插件(coc-clangd),它使用生成的 compile_commands.json 文件仍然表明错误存在,我觉得这不是正确的做法...... 【参考方案1】:

问题在于旧版 DirectX SDK 包含许多过时的标头,并且与 Windows SDK 冲突。在这种情况下,当您包含 Windows.h 时,它来自 Windows SDK,但是当该标头查找 rcpsal.h 时,它从旧版 DirectX SDK 中提取了古老的副本。

如果您将 DXSDK 放在 end,头文件/库包含顺序会有所帮助,但更好的解决方案是 (a) 根据 this blog post 完全不使用旧版 DirectX SDK,或者 ( b) 如果您必须使用它,请按照this blog post 进行修剪。

另见Where is the DirectX SDK (2021 Edition)?。

directxsdk 端口的 VCPkg 版本支持“精简”版本。见this PR。

【讨论】:

非常感谢,我不知道 D3DX 已被弃用,如果没有必要,我会在没有它们的情况下继续前进。

以上是关于DirectX CMake 包括中断 Windows.h的主要内容,如果未能解决你的问题,请参考以下文章

Window10 CMake 配置OpenCV源码

使用opencv320演示window平台cmake的使用方法 20170729

window7装幻想大陆 下载安装Directx时出现:请检查加密服务是不是启用并且Cabinet文件证书是不是有效 如何解决

cmake window下 sh.exe was found in your PATH, here

Window 10 CMake build nu-book_zxing-cpp 1.0.8

Window 10 CMake build nu-book_zxing-cpp 1.0.8