C++ 使用Cmake';s RelWithDebInfo作为默认生成类型

C++ 使用Cmake';s RelWithDebInfo作为默认生成类型,c++,c++11,build,cmake,C++,C++11,Build,Cmake,在开发应用程序和分发应用程序时,使用RelWithDebInfo作为默认构建类型有什么缺点吗 在发布模式下出现问题,而不是在调试模式下出现问题之后,我考虑过这个问题。从那时起,我使用RelWithDebInfo构建类型作为默认类型。我仍然可以调试代码,并且没有任何与构建类型相关的问题 这是防止在调试模式下不会发生错误,但在发布模式下会发生错误的好方法吗?调试优化版本的常见缺点适用 特别是,调试器有时可能会就变量的值对您撒谎。此外,通常不可能检查已优化的变量,这通常会影响函数参数和局部变量 可以说

在开发应用程序和分发应用程序时,使用RelWithDebInfo作为默认构建类型有什么缺点吗

在发布模式下出现问题,而不是在调试模式下出现问题之后,我考虑过这个问题。从那时起,我使用RelWithDebInfo构建类型作为默认类型。我仍然可以调试代码,并且没有任何与构建类型相关的问题


这是防止在调试模式下不会发生错误,但在发布模式下会发生错误的好方法吗?

调试优化版本的常见缺点适用

特别是,调试器有时可能会就变量的值对您撒谎。此外,通常不可能检查已优化的变量,这通常会影响函数参数和局部变量

可以说更糟糕的是,你得不到。RelWithDebInfo设置
NDEBUG
预处理器标志,该标志关闭assert并剥夺您诊断编程错误的强大工具


当然,使用RelWithDebInfo作为默认值没有什么错,但是您仍然应该定期测试所有构建类型。如果您还没有这样做,请为您的项目设置一个持续集成系统,自动在所有生成类型上运行所有测试。

不,好的方法是扔掉坏代码并正确地重写它。仅仅因为它“看起来”起作用并不意味着它起作用了,错误只是隐藏了起来。当然,我们会扔掉坏代码,我想我没有很好地解释我自己。调试模式问题的出现是因为发布模式和调试模式的不同,比如没有优化等等。因此,当您在调试模式下开发时,您不知道您的代码是否有任何发布模式错误,直到您在发布模式下构建它,而发布模式通常是项目完成时。因此,我们不必等到最后才发现bug,我们可以在RelWithDebInfo的开发中看到它,并且仍然具有调试功能。我只是注意到您混合了
RelWithDebugInfo
RelWithDebInfo
(区别在于
ug
)。如果您错误地键入了CMAKE_BUILD_类型,那么它会自动忽略您键入的内容。您不会得到任何特殊标志,例如
-g-NDEBUG-O2
。正确的拼写是
RelWithDebInfo
!谢谢我在标题中打错了。但问题的拼写是正确的。;-)