2012-08-09 134 views
2

可能重复:
Debug/Release difference什么的调试版本和发布版本,区别意味着和使用

我想知道是什么的调试版本的意思和发布版本。两者之间有什么区别。

哪一个我应该使用(我的意思是每个适合的条件)。 和哪个生成其实我正在使用知道,如果一个简单的c + +项目在Visual Studio中[如果我不改变任何项目设置]

我问这是因为我试图让贵使用wxwidges 2.9.4和他们给出不同的情况下添加所需的.lib。这些都是

release ANSI static

debug ANSI static

release Unicode static

debug Unicode static

请把详细的解答。

+0

不,我不给一个详细的解答。 http://haacked.com/archive/2004/02/14/difference-between-debug-vs-release-build.aspx。 – 2012-08-09 12:07:42

+1

你对自己进行了哪些调查?你有没有试图谷歌“调试vs释放”? – Default 2012-08-09 12:07:53

+0

@雅各布S:但是.NET这是C++ – 2012-08-09 12:12:22

回答

16

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

根据您的应用程序,您可以使用不同的编译器和链接器 选项的不同组合编译成一个,两个或更多个不同的方式。 大多数应用程序应该只建立一个版本: 您测试和调试正是客户端使用相同的程序。在 某些情况下,它可能是更实际使用两个不同的构建: 总体来说,客户端代码需要优化,性能方面的原因,但 调试时你不想优化。再就是情况 其中完整的调试(即迭代器验证等)可能会导致代码 那就是即使是算法调试太慢了,所以你必须构建 与完整的调试检查,一个没有优化,但没有迭代器 调试,而有一个优化。您在应用程序启动

任何时候,你必须决定哪些选项你 需求,并创建相应的版本。你可以给他们打电话 你想要的。

关于外部库(如wxwidgets):所有编译器有 当使用不同的选项时有一些不兼容性。所以人们谁 (以源代码形式以外)提供的库必须提供几个 不同的版本,这取决于一系列问题:

  • 发布与调试:发行版本将被编译一个 一套或多或少的标准优化选项(并且没有迭代器 调试);调试版本没有优化,并用迭代器 进行调试。迭代器调试是否存在是 之一,它通常会破坏二进制兼容性。图书馆供应商应该提供 文档哪些选项与每个版本兼容。

  • ANSI与Uni​​code:对于字符数据,这可能意味着较窄的char与较宽的wchar_t 。使用哪一个对应于您在应用程序中使用的 。 (请注意,这两者之间的差异不仅仅是一些编译器开关,您通常需要从根本上改变 不同的代码,并且在所有情况下正确处理Unicode都是不重要的;真正支持Unicode的应用程序必须知道 例如撰写字符或双向书写。)

  • 静态与动态:这决定了库的链接方式以及如何加载 。通常情况下,您需要静态,至少如果您指望将应用程序部署到除开发它之外的其他机器上。但 这也取决于许可证的问题:如果你需要为每个 机,其中文库部署的许可证,它可能使使用 动态更有意义。

+0

感谢您写了一个详细的答案,现在我得到哪一个我应该使用。谢谢.. – netsmertia 2012-08-09 16:09:38

+1

谢谢。现在我完全理解了这个问题。调试版本中没有“魔术”。只是不同的编译器和链接器选项/标志。所以如果我用GCC和-g标志编译一个程序,就不会有性能损失。这仅表示调试符号包含在生成的文件中。性能损失来自不同的标志,如-D(以及在编译时会标记程序或底层库)以及用于优化的-O等选项等等。 – 2013-09-20 11:03:47

+0

'-g'在技术上会有轻微的性能下降,因为二进制文件比较大,但是你是对的 - 这是'O'和一些'D'标志的差别。 – 2017-02-24 01:35:20

1

在调试版本,你得到了很多错误checjking,所以如果出了问题,你可能会得到更翔实的消息(它会运行更慢)

在调试版本,你会得到更多的信息时,你在调试器下运行它。

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

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

+0

你得到你要求的。您可以在“释放”模式下关闭优化,并且可以在“调试”模式下打开它。这些模式只是名称,并不适用于大多数应用程序。 – 2012-08-09 12:33:57

+0

在调试中始终关闭优化是一个好主意 - 否则当您使用调试器来遍历代码时,事情会变得非常混乱。 – ravenspoint 2012-08-09 12:37:10

0

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

与Debug相比,Release有什么不同,因此它们不能混用?主要是内存管理。 Debug中的内存管理有很多额外的功能,可以让您尽早发现错误。作为一个例子,有一些可以检查重写代码的金丝雀。未初始化的内存使用特定的模式进行初始化,...此外,版本中还有很多不用于调试的优化。这使得发布版运行速度更快,但是难以调试代码。方法可能会得到优化,而不是内联,参数传递可以优化使用寄存器,...

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

+0

“只使用Unicode”---只有在您需要时才使用。 Unicode比普通的ANSI复杂得多,尽管如果您计划在单字节编码(例如亚洲大部分地区)未涵盖的地方使用该程序,则需要这样做,但它确实需要更多的努力。 – 2012-08-09 12:35:48

+0

没有太多的努力 - 尤其是因为现代Windows上的所有API函数都需要unicode字符串。我同意,如果你真的想翻译的东西还有更多的努力 - 但这并不取决于你使用std :: wstring和wchar_t *而不是std :: string和char * – 2012-08-10 06:39:21

+0

我同意它没有更多难以使用'wchar_t'而不是使用'char'。但是“使用Unicode”不仅仅是使用'wchar_t';并且使用'wchar_t' _unless_没有意义 - 您正在使用Unicode(或者您正在使用的语言超过256个字符)。这只是增加了复杂性而已。 (就此而言,除非我正在转换文本,否则即使对于Unicode,我也会使用'char'和UTF-8,它使事情变得简单多了。) – 2012-08-10 08:13:18

0

在做一个DEBUG建设项目被设置为不优化(或仅非常轻轻优化)生成的代码,并告诉编译器添加调试信息(包括有关功能的信息,变量以及调试所需的其他信息)。预处理器设置为定义宏_DEBUG

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

另一个区别是,某些“系统”宏(例如ASSERT-like宏)会根据定义的_DEBUG或做不同的事情。 ASSERT在发布版本中不做任何事情,但在调试版本中进行检查并中止。

Unicode与非Unicode之间的区别主要是UNICODE预处理器宏,它告诉头文件是否应启用某些Unicode功能。一件事是,在Unicode版本的非Unicode但char建立TCHAR将被定义为wchar_t

相关问题