使用CMake动态获取Direct3D 12路径的方法咨询
嘿,很高兴看到你在开发基于Direct3D 12的可移植游戏引擎!关于CMake自动适配系统上较新版本D3D12库的问题,其实不用硬编码路径——CMake和Windows SDK本身就提供了很方便的解决方案,下面给你详细说说:
1. 优先用CMake内置的Direct3D12查找模块
从CMake 3.11版本开始,官方就内置了FindDirect3D12.cmake模块,能自动帮你定位系统Windows SDK里的D3D12库,完全不用手动指定路径。具体步骤很简单:
首先,确保你的CMakeLists.txt开头指定了足够新的版本要求:
cmake_minimum_required(VERSION 3.11)
然后用find_package命令找到D3D12:
find_package(Direct3D12 REQUIRED)
最后在链接你的引擎目标时,直接使用CMake提供的导入目标Direct3D12::Direct3D12——它会自动处理库路径、依赖项,并且优先使用系统中最新的Windows SDK版本对应的d3d12.lib:
target_link_libraries(YourGameEngine PRIVATE Direct3D12::Direct3D12)
这种方式是最推荐的,因为它完全遵循CMake的现代实践,让你的项目在不同Windows机器上都能自动适配,完美契合你"可移植引擎"的目标。
2. 手动控制Windows SDK版本(可选)
如果你需要强制引擎使用某个特定版本或更高版本的Windows SDK,可以通过设置CMAKE_SYSTEM_VERSION变量来实现:
# 要求使用Windows SDK 10.0.19041.0及以上版本(对应Win10 20H2) set(CMAKE_SYSTEM_VERSION 10.0.19041.0 CACHE STRING "Windows SDK version" FORCE)
或者在运行CMake生成项目时,通过命令行参数指定:
cmake .. -DCMAKE_SYSTEM_VERSION=10.0.22621.0
CMake会优先查找你指定的SDK版本,如果系统中没有安装,才会 fallback 到最新的可用版本。
3. 为什么别硬编码d3d12.lib路径?
硬编码路径的问题在于,不同用户的Windows SDK安装路径可能不一样(比如默认路径和自定义路径),而且SDK版本更新后,路径里的版本号也会变化——这会导致你的项目在其他机器上编译失败,完全违背了"可移植"的初衷。用CMake的内置模块或者环境变量查找,才能让项目真正跨机器兼容。
旧CMake版本的兼容方案(如果你的版本低于3.11)
如果因为某些原因无法升级CMake,也可以通过读取系统环境变量来动态拼接路径:
# 从系统环境变量中获取Windows SDK的路径和版本 find_library(D3D12_LIB NAMES d3d12.lib PATHS "$ENV{WindowsSdkDir}/Lib/$ENV{WindowsSDKVersion}/um/$ENV{Platform}" REQUIRED ) # 链接到你的引擎目标 target_link_libraries(YourGameEngine PRIVATE ${D3D12_LIB})
这种方式会自动读取WindowsSdkDir、WindowsSDKVersion和Platform这些系统环境变量,拼接出正确的d3d12.lib路径,也能适配不同版本的SDK,但不如内置模块简洁可靠,所以还是建议尽量升级CMake到3.11+。
内容的提问来源于stack exchange,提问作者JamieRhys




