C++ 调试版本和发布版本的区别和用途是什么意思

C++ 调试版本和发布版本的区别和用途是什么意思,c++,debugging,build,release,wxwidgets,C++,Debugging,Build,Release,Wxwidgets,可能重复: 我想知道这两个是什么意思:调试构建和发布构建,以及两者之间的区别 我应该使用哪一种(我的意思是每一种都适合哪些条件) 如果我在VisualStudio中做一个简单的C++项目,现在我正在使用的是哪种构建。[如果我不更改任何项目设置] 我问这个问题是因为我试图使用wxWidgets 2.9.4制作一个GUI,它们给出了添加required.lib的不同情况。这些是 发布ANSI static debug ANSI static release Unicode static debug

可能重复:

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

我应该使用哪一种(我的意思是每一种都适合哪些条件) 如果我在VisualStudio中做一个简单的C++项目,现在我正在使用的是哪种构建。[如果我不更改任何项目设置]

我问这个问题是因为我试图使用wxWidgets 2.9.4制作一个GUI,它们给出了添加required.lib的不同情况。这些是

发布ANSI static

debug ANSI static

release Unicode static

debug Unicode static


请详细回答

在调试版本中,您会得到更多的错误检查,因此,如果出现错误,您可能会得到更多信息(并且运行速度会更慢)

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

通过查看项目属性的预处理器定义,可以判断生成是否为调试生成:\将定义调试


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

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


发布版与调试版相比有什么不同之处,所以它们不能混合使用?主要是内存管理。Debug中的内存管理做了很多额外的事情,使您能够尽早发现错误。例如,有一些金丝雀可以检查代码是否被覆盖。未初始化的内存使用特定的模式初始化。。。此外,在这个版本中有很多优化并没有在调试中使用。这使得发行版运行得更快,但使调试代码变得困难。方法可能会被优化,而不是内联,参数传递可能会被优化以使用寄存器


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

调试版本和发布版本只是名称而已。他们没有任何意义

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

无论何时开始使用应用程序,您都必须决定选择什么选项 需要,并创建相应的构建。你可以叫他们什么 你想要的

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

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

  • ANSI与Unicode:这可能意味着窄
    char
    vs宽
    wchar\t
    用于字符数据。使用哪一个对应于您在中使用的内容 你的申请。(请注意,这两者之间的差异很大 不仅仅是一些编译器开关。您通常需要 不同的代码,在所有情况下正确处理Unicode远远不够 琐碎;真正支持Unicode的应用程序必须了解 比如写汉字或双向书写。)

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


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

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

另一个区别是,某些“系统”宏,例如像宏一样的
ASSERT
,根据是
\u DEBUG
还是
NDEB执行不同的操作