CMAKE_BUILD_TYPE的使用和原理

CMAKE_BUILD_TYPE 是 CMake 中一个用于指定构建类型的内置变量。在使用 CMake 构建项目时,可以使用这个变量来指定编译器使用的编译选项和构建类型。

取值

默认值

默认值是空字符串
可以使用命令查看:
$ cmake --system-information | grep CMAKE_BUILD_TYPE
在这里插入图片描述

系统预定义可选值

根据cmake官方文档, CMAKE_BUILD_TYPE 可以取下面的值:
Debug:这个构建类型启用了调试信息,并且通常关闭了优化,以便于程序员调试和定位问题。编译出的代码可能运行较慢,但包含了详细的调试信息(例如变量的值、函数调用栈等)。
Release:Release 构建类型启用了各种优化选项,以提高代码的性能和运行速度。
RelWithDebInfo:这个构建类型类似于 Release,但是同时包含了一些调试信息,例如函数名和行号等,以便在出现问题时进行调试。
MinSizeRel :这个构建类型旨在最小化可执行文件的尺寸,因此关闭了大部分的调试和优化选项

用户自定义值

除了上面的推荐取值外,用户可以自定义取值,需要在执行cmake命令时指定

值初始化时机

这里直接引用了cmake官方文档的说法:
This variable is initialized by the first project() or enable_language() command called in a project when a new build tree is first created

工作原理

CMAKE_BUILD_TYPE的取值会影响程序的编译和链接
具体来说,cmake中预定义了一批格式为:
CMAKE__FLAGS_的变量
代表不同的构建类型,比如 Debug、Release、RelWithDebInfo、MinSizeRel 等。这些变量用于设置 C 和 C++ 编译器的选项。当设置了 CMAKE_BUILD_TYPE 后,对应的 下的编译器选项就会被应用
可以通过$ cmake --system-information | grep CMAKE_CXX_FLAGS来打印出当前cmake版本预定义的变量值:
CMAKE_BUILD_TYPE的使用和原理_第1张图片

可以看到flags变量有:
CMAKE_CXX_FLAGS_INIT: 全局变量,初始化时使用,无论是什么构建类型都会生效,默认为空;
CMAKE_CXX_FLAGS:全局变量,无论是什么构建类型都会生效;
CMAKE_CXX_FLAG_: 只在相应的构建类型下生效;

如果两个都设置了,相应的设置会叠加一起作用到gcc,由gcc决定最终使用哪个, 比如同时指定了 -O2-O3则gcc最后会按-O3来优化。
如果CMAKE_BUILD_TYPE没有被显式的设置,那它将保持默认值,即空字符串,这时CMAKE_CXX_FLAG_将不会生效,而只使用CMAKE_CXX_FLAGS的值来进行编译。

其他类似的变量还有:
CMAKE_EXE_LINKER_FLAGS_CMAKE_SHARED_LINKER_FLAGS_CMAKE_MODULE_LINKER_FLAGS_:
这些变量用于设置链接器(linker)的选项。CMAKE_EXE_LINKER_FLAGS_ 用于可执行文件链接,CMAKE_SHARED_LINKER_FLAGS_ 用于共享库链接,CMAKE_MODULE_LINKER_FLAGS_ 用于模块链接。根据 CMAKE_BUILD_TYPE 的设置,相应构建类型下的链接器选项将会被应用
CMAKE_BUILD_TYPE的使用和原理_第2张图片
CMAKE_BUILD_TYPE的使用和原理_第3张图片

C++中使用TIPs

可以通过查看 compile_commands.json来查看最后生成的编译指令是否符合预期

参考:

cmake官方文档:
https://cmake.org/cmake/help/v3.22/variable/CMAKE_BUILD_TYPE.html

你可能感兴趣的:(c++,开发语言)