我知道,如果我们设置-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等属性具有特定于配置的变体,这些变体是根据配置类型选择的。
通常IMPORTED库是由于
find_package()
调用而创建的,因此您的项目可能会以依赖于配置的方式与第三方项目链接。 -
CONFIGURATION-安装命令的特定部分。
只有
CONFIGURATION <conf>
部分适用,它对应于活动配置。
多配置工具不使用CMAKE_BUILD_TYPE
变量,但它们仍然具有";构建类型";。该构建类型在配置阶段是未知的,当CMake解析CMakeLists.txt
时,它仅在执行项目的构建时设置。然而,这种构建类型";追溯性";影响上述所有属性。
此外,对于多配置构建工具,选择的构建类型会附加到输出工件的位置,如可执行文件和库(例如,请参阅RUNTIME_output_DIRECTORY目标属性的描述)。