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

What does CMAKE_BUILD_TYPE affect, other than the compiler flag selection?

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

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

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

  • generator expressions:

    表达式 $<$<CONFIG:DEBUG>:XXX> 将扩展为 XXX,CMAKE_BUILD_TYPE 设置为 Debug,否则为空。

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

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

    类似于优化关键字。

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

  • IMPORTED 库的一些属性。

    IMPORTED_LOCATION 等属性有 config-specific variants,根据配置类型选择。

    通常 IMPORTED 库是 find_package() 调用的结果,因此您的项目可能以依赖于配置的方式与 3d 方项目链接。

  • 配置-install 命令的特定部分。

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


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

此外,使用 多配置 构建工具选择的构建类型附加到输出工件的位置,如可执行文件和库(参见 RUNTIME_OUTPUT_DIRECTORY 目标的描述属性).