除了编译器标志选择之外,CMAKE_BUILD_TYPE还会影响什么



我知道,如果我们设置-DCMAKE_BUILD_TYPE=Release(或Debug等),那么CMAKE_C_FLAGS_RELEASECMAKE_CXX_FLAGS_RELEASE的值将分别附加到CMAKE_C_FLAGSCMAKE_C_FLAGS

但这是设置构建类型的唯一效果吗?如果没有,其他影响是什么?

实际上,构建类型会影响很多东西。其中:

  • 生成器表达式:

    表达式$<$<CONFIG:DEBUG>:XXX>将被扩展到XXX,并且CMAKE_BUILD_TYPE被设置为Debug

    由于生成器表达式可以在多个命令中使用,因此设置生成类型会影响所有使用依赖于生成类型的表达式的命令。

  • target_link_libraries使用debug关键字添加的库仅在Debug构建类型中生效。

    类似于优化的关键字。

    (隐含地,这使用了上面描述的生成器表达式)。

  • IMPORTED库的一些性质。

    IMPORTED_LOCATION等属性具有特定于配置的变体,这些变体是根据配置类型选择的。

    通常IMPORTED库是由于find_package()调用而创建的,因此您的项目可能会以依赖于配置的方式与第三方项目链接。

  • CONFIGURATION-安装命令的特定部分。

    只有CONFIGURATION <conf>部分适用,它对应于活动配置。


多配置工具不使用CMAKE_BUILD_TYPE变量,但它们仍然具有";构建类型";。该构建类型在配置阶段是未知的,当CMake解析CMakeLists.txt时,它仅在执行项目的构建时设置。然而,这种构建类型";追溯性";影响上述所有属性。

此外,对于多配置构建工具,选择的构建类型会附加到输出工件的位置,如可执行文件和库(例如,请参阅RUNTIME_output_DIRECTORY目标属性的描述)。

相关内容

最新更新