Qt Creator:Release 和 Debug 构建之间的技术差异

Qt Creator: technical differences between Release and Debug builds

一堆关于使用QtCreator构建过程的问题:

在 QtCreator 中,您可以区分 Release、Debug 和 Profiler 构建。 C.f.下图:

  1. 这些东西到底有什么作用(!)?我无法在互联网上找到和回答。 特别是,我感兴趣的是 Debug 模式是否将项目“debug”添加到 qmake 变量“CONFIG”,“-g”开关要求 g++ 为 gdb(我的调试器)添加调试信息等

  2. “CONFIG += debug”指的是哪个调试器:“普通”调试器 GDB(在我的例子中)还是 QML 调试器?

  3. 为什么在项目文件中经常使用“+=”而不是“*=”?如果项目已经存在,第二个变体不会将项目添加到 qmake 变量。这是否意味着 qmake 特殊变量中的多个相等项是无害的?

非常感谢!

  1. 您可以通过观察在 "Compiler Output" window 窗格中调用的 qmake 命令行来了解它们的作用:

    • 发布:qmake MyProject.pro "CONFIG+=qtquickcompiler"
    • 调试:qmake MyProject.pro "CONFIG+=debug" "CONFIG+=qml_debug"
    • 简介:qmake MyProject.pro "CONFIG+=qml_debug" "CONFIG+=qtquickcompiler" "CONFIG+=force_debug_info" "CONFIG+=separate_debug_info"

    gdb 没有 -g 选项,你是说 gcc 吗? CONFIG+=debug的作用是将-g选项传递给gcc,从Qt/mkspecs/common/gcc-base.conf中的这一行可以看出:

    QMAKE_CFLAGS_DEBUG += -g
    
  2. 编译调试版本仅意味着您编译的库和可执行文件将未经优化,并且包含对调试器有用的额外信息。不需要在特定的调试器中执行,或者根本不需要在任何调试器中执行。您也可以在调试器中 运行 发布版本,尽管您可能会发现结果不太可靠。

  3. qmake特殊变量中的多个相等项通常是无害的,在CONFIG的情况下它们甚至是有意义的。例如,CONFIG 包含 both debugrelease 是合法的。在这种情况下,列表中的最后一个将生效。考虑以下示例中 +=*= 之间的区别:

    CONFIG = debug
    CONFIG += release
    CONFIG += debug   # now CONFIG = debug release debug, so debug is the effective mode
    
    CONFIG = debug
    CONFIG += release
    CONFIG *= debug   # now CONFIG = debug release, so release is the effective mode
    

    *= 在命令行中可能不受青睐的另一个原因是:许多 shell 会将任何包含 * 的参数视为要扩展的文件 glob/wildcard,除非它是转义或引用。