我知道如果我们设置-DCMAKE_BUILD_TYPE=Release
(或Debug
等),那么 和 的值CMAKE_C_FLAGS_RELEASE
将CMAKE_CXX_FLAGS_RELEASE
分别附加到CMAKE_C_FLAGS
和CMAKE_C_FLAGS
。
但这是设置构建类型的唯一效果吗?如果不是,其他影响是什么?
我知道如果我们设置-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()
调用的结果创建的,因此您的项目可能会以配置相关的方式与 3d 方项目链接。
CONFIGURATION - install命令的特定部分。
只有那些CONFIGURATION <conf>
部分适用,对应于活动配置。
多配置工具不使用CMAKE_BUILD_TYPE
变量,但它们仍然具有“构建类型”的概念。该构建类型在配置阶段是未知的,当 CMake 解析时CMakeLists.txt
,它仅在执行项目构建时设置。然而,这种构建类型会“追溯地”影响上述所有属性。
此外,使用多配置构建工具,选择的构建类型会附加到输出工件的位置,例如可执行文件和库(参见例如RUNTIME_OUTPUT_DIRECTORY目标属性的描述)。