8

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

我想知道这两个是什么意思:调试构建和发布构建,两者之间有什么区别。

如果我在 Visual Studio 中制作一个简单的 C++ 项目,我应该使用哪一个(我的意思是每个条件适合哪些条件)以及我现在实际使用的构建。[如果我不更改任何项目设置]

我问这个是因为我正在尝试使用 wxWidgets 2.9.4 制作一个 GUI,并且他们给出了添加所需 .lib 的不同情况。这些是

release ANSI static

debug ANSI static

release Unicode static

debug Unicode static

请给出详细答案。

4

4 回答 4

28

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

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

任何时候你开始一个应用程序,你必须决定你需要什么选项,并创建相应的构建。你可以随便给他们打电话。

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

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

  • ANSI 与 Unicode:这可能意味着字符数据的窄char与宽wchar_t 。使用与您在应用程序中使用的内容相对应的内容。(请注意,这两者之间的区别不仅仅是一些编译器开关。您通常需要完全不同的代码,并且在所有情况下正确处理 Unicode 绝非易事;真正支持 Unicode 的应用程序必须了解诸如组成字符之类的事情或双向书写。)

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

于 2012-08-09T12:30:23.973 回答
7

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

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

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

Unicode和 non-之间的区别Unicode主要是UNICODE预处理器宏,它告诉头文件是否应该启用某些 Unicode 功能。一件事是在 Unicode 版本TCHAR中定义,wchar_tchar在非 Unicode 版本中。

于 2012-08-09T12:31:46.123 回答
3

In the debug build you get a lot more error checjking, so if something goes wrong you may get a more informative message ( and it will run more slowly )

In the debug build you will get more information when you run it under the debugger.

You can tell if the build is debug build by looking at the preprocessor definitions of the project properties: _DEBUG will be defined.

You will send the release build to your clients. ( The debug build uses the debug libraries which are not present on most non development machines )

于 2012-08-09T12:16:28.680 回答
3

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

与 Debug 相比,Release 有什么不同,所以它们不能混用?主要是内存管理。Debug 中的内存管理做了很多额外的事情来让你及早发现错误。例如,可以检查金丝雀是否覆盖代码。未初始化的内存使用特定的模式进行初始化,...此外,发布中有很多优化在调试中未使用。这允许发布运行得更快,但难以调试代码。方法可能会被优化掉,而是被内联,参数传递可能会被优化为使用寄存器,...

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

于 2012-08-09T12:29:18.687 回答