在Qt中执行Debug与Release版本的构建

4

除了在调试版本中嵌入调试符号外,还有其他区别吗?此外,我非常好奇它们在执行二进制文件时如何不同。使用调试符号的机制在调试版本中显示错误。


很显然,有些库(如assert.h)的行为不同。 - Jimmy
我不理解问题除了第一句话之外的内容。 - Frank Osterfeld
Frank,我的意思是一旦调试和发布版本构建完成,您需要以任何方式运行它们,以显示调试版本的输出,并在发布版本中运行应用程序。它们是否以相同的方式执行,或者有没有不同的运行方法来显示调试输出。希望这有意义。 - Tharanga
2个回答

3
在Qt中作为调试编译会设置-DQT_NO_DEBUG标志,该标志用于许多Qt库。正如Jimmy指出的那样,主要性能差异来自这个源头。一个极端的例子是使用调试版本的STL容器来检查边界。如果在调试模式下在您的代码中使用它,可能需要更长时间(Qt不使用此功能,但在其库中引入了类似的检查)。进一步地,通常会更改优化标志。对于发布版,选择-O2而非优化调试。另外,调试构建的另一个重要事项是可以使用它来触发.pro文件中的不同操作,例如添加定义,更改目标或编译针对其他一组库。
CONFIG(debug, debug|release) {
  message("Debug")
  DESTDIR = $$DESTDIR-debug
  CONFIG += debug
  DEFINES += DEBUG
  TARGET = $$TARGET-debug
}else{
  message("Release")  
  DEFINES += QT_NO_DEBUG_OUTPUT
  DESTDIR = $$DESTDIR-release
  TARGET = $$TARGET-release
}

如果您对更多细节感兴趣,请查看qmake配置文件。Linux Ubuntu: /usr/share/qt4/mkspecs/common/g++.conf /usr/share/qt4/mkspecs/common/linux.conf和目标相关的conf文件。

1

"发布版本"和"调试版本"的确切定义和行为取决于构建系统和编译器的使用。与调试版本相比,发布版本通常具有以下一些共同特点:

  • 调试版本通常会生成调试信息,而发布版本则不会。但是也有一些混合版本,例如带有单独调试信息的发布版本。
  • 断言不会被评估(assert(p = getFoo()); 不会分配任何东西 - 也不会断言)。因此,在断言内部具有副作用的表达式是一个坏主意。
  • 优化设置通常不同(在调试版本中没有或很少优化)
  • 调试输出可能会被抑制
  • 任何库开发人员都可以根据例如NDEBUG预处理器宏实现不同的行为

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接