4

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

4

2 回答 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文件

于 2012-07-20T21:33:15.963 回答
1

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

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