对 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 includeDebug
,Release
,RelWithDebInfo
andMinSizeRel
, 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
。