【问题标题】:QMake: test functions do not work as expectedQMake:测试功能无法按预期工作
【发布时间】:2019-12-11 09:14:29
【问题描述】:

在 QtCreator 4.2.0 中,我尝试使用一个 *.pro 文件为多种硬件配置构建二进制文件。

Build & Run => Build Settings => Build Enviroment 我定义了环境变量TARGET,如下所示:

  • 构建设置 A:变量 TARGET 具有值 bbb
  • 构建设置 B:变量 TARGET 具有值 desktop

pro 文件中,我使用以下测试函数:

equals($$TARGET,"bbb")
{
    message("setting include paths for bbb"))
    message($$TARGET)
}

equals($$TARGET,"laptop")
{
    message("setting include paths for laptop.")
    message($$TARGET)
}

contains($$TARGET,"*bbb*")
{
    message("setting include paths for bbb"))
    message($$TARGET)
}

contains($$TARGET,"*laptop*")
{
    message("setting include paths for laptop.")
    message($$TARGET)
}

我在运行 qmake 时得到这个输出:

Project MESSAGE: setting include paths for bbb
Project MESSAGE: bbb
Project MESSAGE: setting include paths for laptop.
Project MESSAGE: bbb
Project MESSAGE: setting include paths for bbb
Project MESSAGE: bbb
Project MESSAGE: setting include paths for laptop.
Project MESSAGE: bbb
Project MESSAGE: setting include paths for bbb

这对我来说毫无意义,我无法弄清楚我在这里做错了什么。为什么laptop测试后的部分会被执行?

顺便说一句,我使用Scopes 解决了我的问题。这对我来说很完美:

CONFIG += $$(TARGET_HW)
desktop {
    message("setting include paths for laptop.")
}

cetec {
    message("setting include paths for cetec."))
}

但我仍然对使用测试函数的正确方法感兴趣。

【问题讨论】:

    标签: qt qt-creator qmake


    【解决方案1】:

    我为第一个测试提供了正确的语法,例如:

    equals(TARGET,"bbb") {
        message("setting include paths for bbb"))
        message($$TARGET)
    }
    

    请注意:

    1. 花括号在测试的同一行。
    2. 测试的变量没有美元符号,只有变量名

    【讨论】:

    • 啊,没错。愚蠢的错误,非常感谢!
    【解决方案2】:

    左大括号必须与条件 (https://doc.qt.io/qt-5/qmake-language.html#scope-syntax) 写在同一行。

    【讨论】:

      【解决方案3】:

      你的问题有很多问题,有其他答案的地方,添加到以前的正确答案:

      1. 正如@daru 所说,您需要打开大括号in the same line 作为测试函数。

      2. 正如@p-a-o-l-o 所说,containsequals 语法要求变量名作为第一个参数,没有 $$。

      3. TARGET 是一个internal variable,默认包含项目文件的基本名称。它成为您正在构建的可执行文件或库的名称。

      4. 您可以使用名为 TARGET 的 environment variable,但您应该将其分配给具有其他名称的 qmake 变量名称。

      示例代码:

      TGT=$$(TARGET)
      
      equals(TGT,"bbb") {
          message("$$TGT equals bbb"))
          message(TGT=$$TGT)
      }
      
      equals(TGT,"laptop") {
          message("$$TGT equals laptop")
          message(TGT=$$TGT)
      }
      
      contains(TGT,"bbb") {
          message("$$TGT contains bbb"))
          message(TGT=$$TGT)
      }
      
      contains(TGT,"top") {
          message("$$TGT contains top")
          message(TGT=$$TGT)
      }
      

      【讨论】:

      • 你是对的。 TARGET 对于这个例子来说是个坏名字。您使用内部 Qmake 变量而不是环境变量的原因是什么?
      • 只是为了说明不同的运算符$$ 用于qmake 变量和$$() 用于环境变量,并且TARGET 是环境变量的有效名称。
      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      相关资源
      最近更新 更多