【问题标题】:qMake: How exactly does qmake interpret the "CONFIG(debug, debug|release)" syntaxqMake:qmake 究竟如何解释“CONFIG(debug, debug|release)”语法
【发布时间】:2013-06-02 10:45:24
【问题描述】:

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

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

那么,当运行qmake时,Qt-Creator的编译输出中会显示如下:

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

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

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

【问题讨论】:

    标签: qt qt-creator qmake


    【解决方案1】:

    在您链接到的文章中,一开始就说项目文件被处理了三遍。这应该回答您的第一个问题;因为它被处理了三次,所以你的 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”的最后一次出现之后.

    【讨论】:

    • 非常感谢您的回答,这非常重要且很有帮助。但是,我不明白“声明评估”的部分。您提到“CONFIG(debug, debug|release) 如果 CONFIG 包含调试等,则计算结果为真……”,您所说的“包含”是什么意思?你的意思是定义为CONFIG += debug 吗?如果是这样,鉴于我的.pro file 中没有这样的定义,那么这个定义在哪里? ..另外一件事,你也定义了这个:CONFIG += release debug release debug release debug,这样定义“debug”和“release”是什么意思?
    • 请原谅我的问题太多,因为我根本找不到任何解释它的互联网资源,更不用说你的解释非常简单,简洁明了。
    • @hashDefine Qt Creator 可以在调用 qmake 时将“release”添加到 CONFIG。例如,如果您在“构建”菜单中选择“运行 qmake”并且您已将构建设置为发布模式,您可以看到它将“CONFIG+=release”作为参数传递给 qmake。由于 CONFIG 已经可以在其中包含“调试”(或者因为您已经将它放在自己的项目文件中,或者它可能来自 mkspec 文件),所以必须有一种方法来覆盖它。这就是存在“在 CONFIG 中最后出现”规则的原因。我给出的例子就是这样;一个例子。自己在 CONFIG 中添加“发布”和“调试”是没有用的。
    • 个人认为debug|release对应debug_and_release
    • @user1914692 构建是调试或发布。不能两者兼有。
    猜你喜欢
    • 2013-03-24
    • 2013-10-04
    • 2023-01-11
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2023-03-17
    相关资源
    最近更新 更多