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

时间:2012-08-09 12:05:21

标签: c++ debugging build release wxwidgets

  

可能重复:
  Debug/Release difference

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

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

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

release ANSI static

debug ANSI static

release Unicode static

debug Unicode static

请详细解答。

4 个答案:

答案 0 :(得分:22)

Debug build和release build只是名称。它们没有任何意义。

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

无论何时开始申请,您都需要决定选择哪些选项 需要,并创建相应的构建。你可以打电话给他们 你想要的。

关于外部库(如wxwidgets):所有编译器都有 使用不同选项时出现一些不兼容问题。那么人呢 提供库(源代码形式除外)必须提供几个 不同的版本,取决于许多问题:

  • 发布与调试:发布版本将使用a编译 一组或多或少的标准优化选项(并没有迭代器 调试);没有优化的调试版本,以及迭代器 调试。是否存在迭代器调试是一回事 这通常打破二进制兼容性。图书馆供应商应该 记录哪些选项与每个版本兼容。

  • ANSI与Uni​​code:这可能意味着缩小char与宽wchar_t 用于字符数据。使用哪一个对应于您使用的内容 你的申请。 (请注意,这两者之间的差异很大 不只是一些编译器开关。你经常需要从根本上 不同的代码,并且在所有情况下正确处理Unicode都远非如此 不重要的;一个真正支持Unicode的应用程序必须要注意 像组成字符或双向书写之类的东西。)

  • 静态与动态:这决定了库的链接方式 加载。通常,你会想要静态,至少如果你指望部署 您在其他机器上的应用程序,而不是您开发它的应用程序。但 这还取决于许可问题:如果您需要每个许可证 部署库的机器,使用起来可能更有意义 动态的。

答案 1 :(得分:3)

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

另一方面,RELEASE构建具有更高级别的优化,并且不保存调试信息。预处理器设置为定义NDEBUG宏。

另一个区别是,某些“系统”宏(例如ASSERT - 就像宏一样,根据是否定义_DEBUGNDEBUG执行不同的操作。 ASSERT在发布版本中不执行任何操作,但会在调试版本中进行检查和中止。

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

答案 2 :(得分:2)

在调试版本中,你会得到更多的错误,因此如果出现问题,你可能会收到更多信息(而且运行速度会更慢)

在调试版本中,当您在调试器下运行它时,您将获得更多信息。

您可以通过查看项目属性的预处理器定义来判断构建是否是调试版本:将定义_DEBUG。

您将向客户发送发布版本。 (调试版本使用大多数非开发机器上不存在的调试库)

答案 3 :(得分:2)

如果要将静态库链接到项目,则需要使用与编译代码相同的设置进行编译。这就是为什么有一个Debug&该库的发行版。此外,您需要指定是否要使用unicode或ansi。答案很简单(在我看来) - 只需使用unicode。

Release与Debug相比有什么不同,以至于它们不能混用?主要是内存管理。 Debug中的内存管理还可以执行许多其他操作,以便您尽早发现错误。例如,有些金丝雀可以检查是否覆盖了代码。使用特定模式初始化未初始化的内存,...此外,在发布中还有许多未在调试中使用的优化。这允许释放运行得更快,但很难调试代码。方法可能会被优化掉,而是内联,参数传递可以优化使用寄存器,......

所以在C ++中你管理(至少)2个配置。您与调试库链接的一个Debug配置。这个用于开发和发展测试。以及与发布库链接的Release配置。这个是交付。但是不要忘记您需要测试Release以及它可能与Debug配置的行为不同。