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_<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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值