调试构建和发布构建,差异和用途意味着什么

Nat*_*ngh 2 c++ debugging wxwidgets release build

可能重复:
调试/发布差异

我想知道调试构建和发布版本意味着什么.两者之间有什么区别.

我应该使用哪一个(我的意思是每个人的合适条件).实际上我正在使用的构建知道如果在visual studio中制作简单的c ++项目.[如果我不更改任何项目设置]

我问这个是因为我试图使用wxwidges 2.9.4制作gui,并且他们给出了添加所需.lib的不同情况.这些是

release ANSI static

debug ANSI static

release Unicode static

debug Unicode static

请详细解答.

Jam*_*nze 24

调试构建和发布版本只是名称.他们没有任何意义.

根据您的应用程序,您可以使用编译器和链接器选项的不同组合,以一种,两种或更多种方式构建它. 大多数应用程序应该只构建在一个版本中:您测试和调试客户端使用的完全相同的程序.在某些情况下,使用两个不同的构建可能更实际:总体而言,出于性能原因,客户端代码需要优化,但在调试时不需要优化.然后有些情况下,完全调试(即迭代器验证等)可能导致代码对于算法调试来说太慢,因此您将拥有一个完整调试检查的构建,一个没有优化,但没有迭代器调试和一个优化.

无论何时开始使用应用程序,都必须确定所需的选项,并创建相应的构建.你可以随意打电话给他们.

关于外部库(如wxwidgets):当使用不同的选项时,所有编译器都有一些不兼容性.因此,提供库(源代码形式除外)的人必须提供几个不同的版本,具体取决于许多问题:

  • release vs. debug:发布版本将使用一组或多或少的标准优化选项进行编译(并且没有迭代器调试); 没有优化的调试版本,以及迭代器调试.是否存在迭代器调试是通常会破坏二进制兼容性的一件事.库供应商应记录哪些选项与每个版本兼容.

  • ANSI与Uni​​code:这可能意味着 字符数据的窄char与宽wchar_t.使用哪一个对应于您在应用程序中使用的内容.(请注意,这两者之间的区别不仅仅是一些编译器开关.您经常需要完全不同的代码,并且在所有情况下正确处理Unicode远非微不足道;真正支持Unicode的应用程序必须知道组合字符之类的事情或双向书写.)

  • 静态与动态:这决定了库的链接和加载方式.通常,您需要静态,至少如果您指望在其他计算机上部署应用程序而不是您开发的应用程序.但这也取决于许可问题:如果您需要为部署库的每台计算机提供许可,那么使用动态可能更有意义.

  • 谢谢。现在我完全理解了这个问题。调试版本中没有“魔术”。只是不同的编译器和链接器选项/标志。因此,如果我使用GCC和-g标志编译程序,则不会降低性能。这仅表示调试符号包含在结果文件中。性能损失来自不同的标志,例如-D(在编译时会考虑到您的程序或底层库),以及-O等用于优化的选项,等等。 (2认同)

Som*_*ude 6

当进行DEBUG构建的项目设置为不优化(或只有非常轻微优化)生成的代码,并告诉编译器添加调试信息(包括有关函数,变量和调试所需的其他信息)。设置预处理器来定义_DEBUG宏。

一个RELEASE在另一方面构建具有优化的更高水平,并没有调试信息保存。设置预处理器来定义NDEBUG宏。

另一个区别是某些“系统”宏,例如ASSERT-like 宏,根据 if_DEBUGNDEBUGis 定义做不同的事情。ASSERT在发布版本中什么都不做,但在调试版本中进行检查和中止。

Unicode和非之间的区别Unicode主要是UNICODE预处理器宏,它告诉头文件是否应该启用某些 Unicode 功能。一件事是TCHARwchar_t在 Unicode 构建中定义为,但char在非 Unicode 构建中定义。