在CMake中如何实现仅Release模式下条件构建指定目标?
现代CMake检测构建类型的正确方案
首先解释你之前写法失效的核心原因:CMAKE_BUILD_TYPE 仅对单配置生成器(比如Makefile、Ninja)生效,这类生成器在CMake配置阶段就固定了构建类型。而你使用的带--config参数的构建命令,对应的是多配置生成器(比如Visual Studio、Xcode、Ninja Multi-Config),这类生成器的构建类型是在构建阶段才确定的,配置阶段执行的if判断根本无法获取最终的构建类型,因此判断逻辑不生效。
根据你的需求,对应两种不同的实现方案:
场景1:仅在Release模式下构建指定目标
如果要实现仅Release构建时才生成目标,其他构建类型完全不构建该目标,可通过目标属性配合多配置兼容逻辑实现:
add_executable(your_target src/main.cpp) # 处理多配置生成器场景 set_target_properties(your_target PROPERTIES # 所有配置默认不构建该目标 EXCLUDE_FROM_DEFAULT_BUILD ON # Release配置下允许构建 EXCLUDE_FROM_DEFAULT_BUILD_RELEASE OFF ) # 兼容单配置生成器场景 get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(NOT is_multi_config) if(NOT CMAKE_BUILD_TYPE STREQUAL "Release") set_target_properties(your_target PROPERTIES EXCLUDE_FROM_ALL ON) endif() endif()
配置完成后,只有执行cmake --build . --config Release(多配置生成器)或者配置阶段指定-DCMAKE_BUILD_TYPE=Release(单配置生成器)时,才会构建该目标。
场景2:仅在Release模式下为目标设置特定属性、编译选项、依赖等
直接使用CMake生成器表达式即可,生成器表达式会在构建阶段根据实际选择的配置动态生效,天然支持多配置和单配置生成器:
- 仅Release模式下添加编译选项
target_compile_options(your_target PRIVATE $<$<CONFIG:Release>:-O3 -DNDEBUG>) - 仅Release模式下链接指定依赖库
target_link_libraries(your_target PRIVATE $<$<CONFIG:Release>:release_only_lib>) - 仅Release模式下设置目标的输出路径
set_target_properties(your_target PROPERTIES RUNTIME_OUTPUT_DIRECTORY $<$<CONFIG:Release>:${CMAKE_CURRENT_BINARY_DIR}/release_output> )
注意事项
- 生成器表达式中
CONFIG的匹配大小写不敏感,$<$<CONFIG:Release>:xxx>和$<$<CONFIG:RELEASE>:xxx>效果完全一致 - 多配置生成器场景下永远不要依赖
CMAKE_BUILD_TYPE做构建类型相关的逻辑判断,该变量在多配置生成器下默认是空值,不会随构建时传入的--config参数变化
内容的提问来源于stack exchange,提问作者bernd feinman
相关产品推荐
相关产品推荐

