在Qt中执行调试版本与发布版本
如果存在任何其他差异,除了调试构建中嵌入的调试符号之外,是否还有其他人可以解释。此外,我很想知道它们在执行二进制代码方面有何不同。正在使用的机制在调试生成中使用调试符号会显示错误。在qt中编译为调试集一方面,编译器调用中的-DQT\u NO\u debug标志在许多qt库中使用。 正如Jimmy已经指出的,主要的性能差异来自这个来源。 一个极端的例子可能是使用STL容器的调试版本来检查边界。如果在调试模式下的代码中使用此选项,则可能需要更长的时间(Qt不使用此选项,但在其库中引入了类似的检查) 此外,通常会更改优化标志。 对于发行版-O2被选择用于发行版,而不是用于调试的优化 关于调试构建,更重要的一点是,您可以使用它触发pro文件中的不同内容,如添加定义、更改目标或根据另一组库进行编译:在Qt中执行调试版本与发布版本,qt,debugging,build,release,Qt,Debugging,Build,Release,如果存在任何其他差异,除了调试构建中嵌入的调试符号之外,是否还有其他人可以解释。此外,我很想知道它们在执行二进制代码方面有何不同。正在使用的机制在调试生成中使用调试符号会显示错误。在qt中编译为调试集一方面,编译器调用中的-DQT\u NO\u debug标志在许多qt库中使用。 正如Jimmy已经指出的,主要的性能差异来自这个来源。 一个极端的例子可能是使用STL容器的调试版本来检查边界。如果在调试模式下的代码中使用此选项,则可能需要更长的时间(Qt不使用此选项,但在其库中引入了类似的检查)
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文件与“调试构建”相比,“发布构建”的确切定义和行为取决于构建系统和您使用的编译器。与调试版本相比,发布版本的一些常见属性:
- 调试版本通常会生成调试信息,而发布版本则不会。不过也有一些混合版本,比如带有单独调试信息的发布版本
- 断言不会被计算(assert(p=getFoo());不会分配任何内容-也不会assert)。因此,在断言中带有副作用的表达式是个坏主意
- 优化设置通常是不同的(调试版本中没有或很少优化)
- 调试输出可能被抑制
- 任何库开发人员还可能根据NDEBUG预处理器宏等实现不同的行为