cmake_minimum_required版本对VS2019生成文件的影响及问题排查
问题分析与解决方案
这不是CMake的Bug,是CMake版本政策变化导致的预期行为——cmake_minimum_required(VERSION X.Y.Z)的作用远不止版本检查,它还会隐式执行cmake_policy(VERSION X.Y.Z),启用该版本及之前所有CMake政策的默认行为。高版本CMake的政策对自定义配置的处理逻辑和旧版本不同,才会出现你遇到的差异。
具体原因
在CMake 2.8.12的旧政策下,自定义的MyDebug配置会被自动识别为Debug类配置,自动继承_DEBUG编译宏和MultiThreadedDebugDLL运行库。但从高版本开始,CMake对自定义配置的类型匹配变得严格,不再自动推断配置的Debug/Release属性,必须显式声明。
修复方法
在使用高版本cmake_minimum_required时,需要手动为自定义的MyDebug配置绑定Debug属性:
- 首先声明支持的配置列表:
set(CMAKE_CONFIGURATION_TYPES "MyDebug;Release" CACHE STRING "Supported build configurations" FORCE)
- 为
MyDebug配置显式设置_DEBUG宏:
target_compile_definitions(YourTargetName PRIVATE $<$<CONFIG:MyDebug>:_DEBUG> # 其他自定义宏... )
- 指定
MyDebug配置的运行库:
set_target_properties(YourTargetName PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreadedDebugDLL$<$<CONFIG:MyDebug>:>" MSVC_RUNTIME_LIBRARY "MultiThreadedDLL$<$<CONFIG:Release>:>" )
或者更灵活的方式,用编译选项直接指定:
target_compile_options(YourTargetName PRIVATE $<$<CONFIG:MyDebug>:/MDd> $<$<CONFIG:Release>:/MD> )
额外说明
如果你想在高版本CMake下临时保留旧政策的行为,可以显式设置对应政策为OLD,但不推荐(政策更新通常是为了修复问题或规范行为):
cmake_minimum_required(VERSION 3.24.1) # 需根据具体政策编号调整,可查CMake文档确认对应配置推断的政策ID cmake_policy(SET CMP00XX OLD)
内容的提问来源于stack exchange,提问作者jpo38
相关产品推荐
相关产品推荐

