在Qt中执行Debug vs release build

时间:2012-07-20 10:56:53

标签: qt debugging build release

如果存在任何其他差异,可以解释除调试构建中嵌入的调试符号之外的其他人。此外,我非常好奇,知道他们在执行二进制文件方面有何不同。正在使用的机制使用调试版本中的调试符号来显示错误。

2 个答案:

答案 0 :(得分:3)

在qt中编译为调试,编译器调用中的-DQT_NO_DEBUG标志用于许多qt库中。-QQT_NO_DEBUG标志。 正如吉米已经指出的那样,主要的性能差异来自于这个来源。 一个极端的例子可能是使用可用于检查边界的STL容器的调试版本。如果在调试模式下代码中使用了这些内容,则可能需要更长时间(Qt不使用此代码,但会对其库引入类似的检查)。

通常还会更改优化标志。 对于发布 - 选择发布-O2而不是优化调试

关于调试版本的一个更重要的事情是,您可以使用它来触发专业文件中的不同内容,例如添加定义,更改目标或针对另一组库进行编译:

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和目标相关配置文件

答案 1 :(得分:1)

“发布版本”与“调试版本”的确切定义和行为取决于构建系统和您使用的编译器。与调试版本相比,版本构建的一些常见属性:

  • debug build通常生成调试信息,不发布版本。但是有一些混合版本,比如发布版本和单独的调试信息。
  • 不评估断言(断言(p = getFoo());不会分配任何东西 - 也不会断言)。所以在断言中带有副作用的表达式是个坏主意。
  • 优化设置通常不同(调试版本中没有或很少有优化)
  • 调试输出可能会被抑制
  • 任何图书馆开发者可能另外实施不同的行为,具体取决于NDEBUG预处理器宏