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
我用来生成/编译的命令:
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的主要内容,如果未能解决你的问题,请参考以下文章
使用opencv320演示window平台cmake的使用方法 20170729
window7装幻想大陆 下载安装Directx时出现:请检查加密服务是不是启用并且Cabinet文件证书是不是有效 如何解决
cmake window下 sh.exe was found in your PATH, here