【问题标题】:What does CMAKE_BUILD_TYPE affect, other than the compiler flag selection?除了编译器标志选择之外,CMAKE_BUILD_TYPE 有什么影响?
【发布时间】:2018-03-30 21:04:28
【问题描述】:

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

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

【问题讨论】:

  • 作为一个快速说明:如果可能,您应该避免使用 CMake wiki,因为它已经过时并且通常不是很准确。 official documentation 是一种更好的信息来源(至少对于 CMake 3.0 及更高版本)。

标签: cmake release-builds debug-build


【解决方案1】:

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

  • 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 方项目链接。

  • CONFIGURATION-install 命令的特定部分。

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


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

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

【讨论】:

  • 不确定我是否理解最后一段。 Afaik,CMAKE_BUILD_TYPE 的值应该对多配置生成器没有影响。这也是the documentation 所说的:这个变量只对单一配置的生成器有意义
  • 你能否扩展一下,也许举个例子,关于不同的项目符号?
  • 我已经编辑了多配置工具的构建类型的描述。希望事情现在变得清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
相关资源
最近更新 更多