46

我虽然读过HERE,但我仍然不理解qmake CONFIG变量的语法。例如,如果我的 CONFIG 设置有以下.pro file

CONFIG(debug, debug|release) {
    message("debug mode")
}else {
    message("release mode")
}

然后,运行时qmake,Qt-Creator 的 Compile Output 中会显示以下内容:

Project MESSAGE: debug mode
Project MESSAGE: debug mode
Project MESSAGE: release mode

知道我正在以“调试模式”构建我的项目,那么我的问题是:

  • 为什么不只显示“调试模式”消息?为什么不只显示一次?
  • 那么,既然我在“调试模式”下构建,为什么会显示“项目消息:发布模式”消息
  • 确切地说,语法: CONFIG(debug, debug|release) 的真正含义是什么?这是否意味着以调试模式构建,然后再次以调试模式构建,最后以发布模式构建?我知道这些括号“{}”表示一个范围(旧链接已失效,推荐范围)但是 qmake 如何解释这些括号“()”内的内容?
4

1 回答 1

66

在您链接到的文章中,一开始就说项目文件被处理了三遍。这应该回答您的第一个问题;因为它被处理了三次,所以你的 message() 也被执行了三次。为什么要多次处理?因为 qmake 不会构建你的项目!它只生成构建指令,然后用于实际构建项目。为了为所有可能的配置生成构建指令,它需要多次处理项目文件,每个配置一次。

对于您的第二个问题:您的项目仅在您选择的调试模式下构建,但是如上所述,构建指令也是为发布模式创建的。例如,当将“make”与 mingw(而不是 Visual Studio)一起使用时,您会得到两个 Makefile:Makefile.ReleaseMakefile.Debug. 当它生成发布 makefile 时,就是打印“发布模式”的时候。

最后,CONFIG(debug, debug|release)如果 CONFIG 包含“debug”但不包含“release”,或者它同时包含“debug”和“release”但在最后一次出现“debug”之后没有出现“release”,则计算结果为 true。例如你可能有这个:

CONFIG += release debug release debug release debug

由于最后一个“调试”是在最后一个“发布”之后出现的,CONFIG(debug, debug|release)所以是真的。

CONFIG() 的第一个参数(在本例中为“debug”)是最后出现的值。第二个参数(“debug|release”)是检查第一个参数的一组值。

将其翻译成英语会给出这样的结果:如果“debug”至少出现一次,则评估为真,如果“release”也出现,“debug”的最后一次出现在“release”的最后一次出现之后。

于 2013-06-07T00:07:26.993 回答