仅为Debug配置安装所需系统库的CMake配置问题
解决CMake仅在Debug配置下安装调试系统库的问题
正确实现方案
针对多配置生成器(如Visual Studio、Xcode)和单配置生成器(如Makefile),可以采用以下两种方式实现需求:
1. 通用多配置兼容方案(推荐)
通过install(CODE)在安装阶段动态判断当前配置,仅在Debug安装时执行系统库安装逻辑:
# 封装Debug系统库安装逻辑为函数 function(install_debug_system_libraries) set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) set(CMAKE_INSTALL_OPENMP_LIBRARIES TRUE) set(CMAKE_INSTALL_DEBUG_LIBRARIES TRUE) set(CMAKE_INSTALL_DEBUG_LIBRARIES_ONLY TRUE) include(InstallRequiredSystemLibraries) endfunction() # 仅在Debug配置安装时触发函数执行 install(CODE " if(\$ENV{CMAKE_INSTALL_CONFIG_NAME} STREQUAL \"Debug\") install_debug_system_libraries() endif() " COMPONENT Runtime)
执行安装时,指定配置即可触发对应逻辑:
# 安装Debug配置,会自动安装调试系统库 cmake --install . --config Debug # 安装Release配置,不会安装任何系统库 cmake --install . --config Release
2. 单配置生成器专属方案(Makefile等)
如果仅针对单配置生成器(如GNU Make),可以直接通过CMAKE_BUILD_TYPE判断:
if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) set(CMAKE_INSTALL_OPENMP_LIBRARIES TRUE) set(CMAKE_INSTALL_DEBUG_LIBRARIES TRUE) set(CMAKE_INSTALL_DEBUG_LIBRARIES_ONLY TRUE) include(InstallRequiredSystemLibraries) endif()
原方案失效原因分析
方案一:生成器表达式在配置阶段无法正确求值
if($<CONFIG:Debug>) # ... 配置变量并include脚本 endif()
if语句在CMake配置阶段执行,此时生成器表达式$<CONFIG:Debug>会被当作普通字符串处理,而非布尔值,导致条件永远为真,所有配置都会执行后续逻辑。
方案二:生成器表达式赋值无法被脚本识别
set(CMAKE_INSTALL_DEBUG_LIBRARIES $<IF:$<CONFIG:Debug>,TRUE,FALSE>) include(InstallRequiredSystemLibraries)
InstallRequiredSystemLibraries脚本在配置阶段读取变量值,此时生成器表达式尚未被解析,变量存储的是原始字符串而非布尔值,脚本会将非空字符串视为TRUE,导致所有配置都安装系统库。
内容的提问来源于stack exchange,提问作者Kevin Haybach
相关产品推荐
相关产品推荐

