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_<LANGUAGE>_FLAGS_<CONFIG>
的变量
代表不同的构建类型,比如 Debug、Release、RelWithDebInfo、MinSizeRel 等。这些变量用于设置 C 和 C++ 编译器的选项。当设置了 CMAKE_BUILD_TYPE
后,对应的 下的编译器选项就会被应用
可以通过$ cmake --system-information | grep CMAKE_CXX_FLAGS
来打印出当前cmake版本预定义的变量值:
可以看到flags变量有:
CMAKE_CXX_FLAGS_INIT:
全局变量,初始化时使用,无论是什么构建类型都会生效,默认为空;
CMAKE_CXX_FLAGS
:全局变量,无论是什么构建类型都会生效;
CMAKE_CXX_FLAG_<CONFIG>
: 只在相应的构建类型下生效;
如果两个都设置了,相应的设置会叠加一起作用到gcc,由gcc决定最终使用哪个, 比如同时指定了 -O2
和 -O3
则gcc最后会按-O3
来优化。
如果CMAKE_BUILD_TYPE
没有被显式的设置,那它将保持默认值,即空字符串,这时CMAKE_CXX_FLAG_<CONFIG>
将不会生效,而只使用CMAKE_CXX_FLAGS
的值来进行编译。
其他类似的变量还有:
CMAKE_EXE_LINKER_FLAGS_<CONFIG>
、CMAKE_SHARED_LINKER_FLAGS_<CONFIG>
和 CMAKE_MODULE_LINKER_FLAGS_<CONFIG>
:
这些变量用于设置链接器(linker)的选项。CMAKE_EXE_LINKER_FLAGS_ 用于可执行文件链接,CMAKE_SHARED_LINKER_FLAGS_ 用于共享库链接,CMAKE_MODULE_LINKER_FLAGS_ 用于模块链接。根据 CMAKE_BUILD_TYPE 的设置,相应构建类型下的链接器选项将会被应用
C++中使用TIPs
可以通过查看 compile_commands.json来查看最后生成的编译指令是否符合预期
参考:
cmake官方文档:
https://cmake.org/cmake/help/v3.22/variable/CMAKE_BUILD_TYPE.html