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:这可能意味着窄
vs宽char
用于字符数据。使用哪一个对应于您在中使用的内容 你的申请。(请注意,这两者之间的差异很大 不仅仅是一些编译器开关。您通常需要 不同的代码,在所有情况下正确处理Unicode远远不够 琐碎;真正支持Unicode的应用程序必须了解 比如写汉字或双向书写。)wchar\t
- 静态与动态:这决定了库的链接方式和 加载。通常,您需要静态的,至少如果您指望部署 您的应用程序可以在其他机器上运行,而不是在您开发应用程序的机器上运行。但是 这还取决于许可证问题:如果您需要每个许可证 在部署库的机器上,使用它可能更有意义 动态的
调试时,项目设置为不优化(或仅非常轻微地优化)生成的代码,并告诉编译器添加调试信息(包括有关函数、变量和调试所需的其他信息)。预处理器设置为定义\u DEBUG
宏
另一方面,版本
构建具有更高级别的优化,并且不保存调试信息。预处理器设置为定义NDEBUG
宏
另一个区别是,某些“系统”宏,例如像宏一样的ASSERT
,根据是\u DEBUG
还是NDEB执行不同的操作