对 CMake 构建类型 CMAKE_BUILD_TYPE 的考量

参考

https://stackoverflow.com/a/59314670/

https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html 的解释:

Specifies the build type on single-configuration generators (e.g. Makefile Generators or Ninja). Typical values include DebugReleaseRelWithDebInfo and MinSizeRel, but custom build types can also be defined.

Stack Overflow 回答里提到的 BetaTest 等其他构建类型应该就是上面所说的 custom build types.

在尽可能复现错误的情况下调试

使用 RelWithDebInfo?

考虑编译器 gcc 或者 clang:

  • RelWithDebInfo:-O2 -g -DNDEBUG
  • Release: -O3 -DNDEBUG

这样来看这两个选项的优化等级还是有区别的。

我觉得是因为 -O3 使用了大量空间换时间的优化方式,对应到源码上不好调试,所以 RelWithDebInfo 才没有用 -O3。虽然优化等级不一样,但是(如果相信编译器绝对不会有 bug)后者出现的错误在前者大概率也能复现?

在 MSVC 上,优化等级还是 /O2,但是内联等特殊的优化选项会降级。

使用自定义构建类型

比如 -O3 -g 来代替 -O3 -DNDEBUG