CMAKE_BUILD_TYPE 除了编译器标志选择之外还有什么影响?
What does CMAKE_BUILD_TYPE affect, other than the compiler flag selection?
我know如果我们设置-DCMAKE_BUILD_TYPE=Release
(或Debug
等),那么CMAKE_C_FLAGS_RELEASE
和CMAKE_CXX_FLAGS_RELEASE
的值将被附加分别为 CMAKE_C_FLAGS
和 CMAKE_C_FLAGS
。
但这就是设置构建类型的唯一效果吗?如果没有,其他影响是什么?
实际上,构建类型会影响很多事情。其中:
-
表达式 $<$<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 目标的描述属性).
我know如果我们设置-DCMAKE_BUILD_TYPE=Release
(或Debug
等),那么CMAKE_C_FLAGS_RELEASE
和CMAKE_CXX_FLAGS_RELEASE
的值将被附加分别为 CMAKE_C_FLAGS
和 CMAKE_C_FLAGS
。
但这就是设置构建类型的唯一效果吗?如果没有,其他影响是什么?
实际上,构建类型会影响很多事情。其中:
-
表达式
$<$<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 目标的描述属性).