【问题标题】:executing Debug vs release builds in Qt在 Qt 中执行调试与发布版本
【发布时间】:2012-07-20 10:56:53
【问题描述】:

除了嵌入在调试版本中的调试符号之外,其他人能否解释一下,如果有任何其他区别。此外,我很想知道它们在执行二进制文件方面有何不同。在调试版本中使用了哪些机制使用调试符号显示错误。

【问题讨论】:

  • 这可能是显而易见的,但有些库(例如 assert.h)的行为不同
  • 第一句以外的问题我没看懂。
  • 弗兰克,我的意思是一旦构建了调试和发布版本,您需要以任何方式运行它们,以在构建调试的情况下显示调试并在构建的版本中运行应用程序.它们是以相同的方式执行还是有任何不同的运行方法来显示调试输出。希望这是有道理的。

标签: qt debugging build release


【解决方案1】:

在 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文件

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 2010-10-27
      • 2020-08-02
      • 1970-01-01
      • 2013-03-08
      • 2011-04-16
      相关资源
      最近更新 更多