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