Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Qt中执行调试版本与发布版本_Qt_Debugging_Build_Release - Fatal编程技术网

在Qt中执行调试版本与发布版本

在Qt中执行调试版本与发布版本,qt,debugging,build,release,Qt,Debugging,Build,Release,如果存在任何其他差异,除了调试构建中嵌入的调试符号之外,是否还有其他人可以解释。此外,我很想知道它们在执行二进制代码方面有何不同。正在使用的机制在调试生成中使用调试符号会显示错误。在qt中编译为调试集一方面,编译器调用中的-DQT\u NO\u debug标志在许多qt库中使用。 正如Jimmy已经指出的,主要的性能差异来自这个来源。 一个极端的例子可能是使用STL容器的调试版本来检查边界。如果在调试模式下的代码中使用此选项,则可能需要更长的时间(Qt不使用此选项,但在其库中引入了类似的检查)

如果存在任何其他差异,除了调试构建中嵌入的调试符号之外,是否还有其他人可以解释。此外,我很想知道它们在执行二进制代码方面有何不同。正在使用的机制在调试生成中使用调试符号会显示错误。

在qt中编译为调试集一方面,编译器调用中的-DQT\u NO\u 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文件

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

  • 调试版本通常会生成调试信息,而发布版本则不会。不过也有一些混合版本,比如带有单独调试信息的发布版本
  • 断言不会被计算(assert(p=getFoo());不会分配任何内容-也不会assert)。因此,在断言中带有副作用的表达式是个坏主意
  • 优化设置通常是不同的(调试版本中没有或很少优化)
  • 调试输出可能被抑制
  • 任何库开发人员还可能根据NDEBUG预处理器宏等实现不同的行为

这可能是显而易见的,但有些库(例如assert.h)的行为不同。除了第一句话,我不理解这个问题。弗兰克,我的意思是,一旦调试和发布构建完成,你需要以任何方式运行它们,显示生成调试时的调试输出,并在生成版本中运行应用程序。它们是否以相同的方式执行,或者是否有任何不同的运行方法来显示调试输出。希望这有意义。