26

我安装了多个版本的 Qt,我需要用所有这些版本编译我的项目。
使用 pro 文件,我在文档中找不到如何进行条件编译。

理想情况下,这就是我想做的:

QT_VERSION = 5   # this can be 4, set manually

if(QT_VERSION == 5) {
   QT += widgets
}
if(QT_VERSION == 4) {
   QT += gui
}

当然,if() 命令在 pro 文件中不存在。
有没有更好的方法来做同样的事情?

4

4 回答 4

30

您可以在此处使用条件函数和范围:

QT_VERSION = 5   # this can be 4, set manually

equals(QT_VERSION, 5){
   QT += widgets
}
equals(QT_VERSION, 4) {
   QT += gui
}

但是,您需要在原始代码中注意以下几点:

  1. 明确定义 Qt 版本不是必需的,如果您忘记在 .pro 文件中更改它可能会让您头疼。相反,qmake 会自动QT_MAJOR_VERSION为您定义一个变量。

  2. 在这种情况下使用equals将起作用。但是,如下所述,equals执行字符串比较。但是,最好使用它greaterThanlessThan因为当您尝试使用 Qt 6(将来某个地方)编译它时,您的代码将自动停止工作。

  3. 不需要添加gui,因为它默认包含在内。QT

所以,你的代码应该是:

greaterThan(QT_MAJOR_VERSION, 4) {
    QT += widgets
}

以下是一些未记录的qmake宝石

  • defined(func, type)
    

    func如果已定义,则返回 true ;type 必须是testor replace,以匹配defineTestor defineReplace

  • equals(var1, var)
    

    (也可用作isEqual)。
    如果 var1 等于 var2(字符串比较),则返回 true。

  • lessThan(var1, var2)`
    

    var1如果小于var2(作为整数),则返回 true 。

  • greaterThan(var1, var2)
    

    var1如果大于var2(作为整数)返回真。

  • inFile(file, var, val)
    

    var如果在指定文件中定义了变量,则返回 true 。此外,它可以测试它是否具有请求的值。

  • load(string)
    

    include()和之间的某种交叉CONFIG += [feature]load(foo)将在标准功能路径中查找名为“foo.prf”的文件,并立即执行其内容。CONFIG在“.pro”文件完成处理之后,最后执行其中包含的功能。就像include(),如果找到文件,它将返回 true。

于 2013-09-06T17:34:41.500 回答
10

您可以像这样在一行中进行检查:

equals(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 5) {
   QT += bluetooth
} else {
  message(Qt $$QT_VERSION Bluetooth not supported.)
}

!lessThanthere 代表更大或相等。

于 2018-05-28T09:33:47.993 回答
9

不确定从什么时候开始(我猜是 Qt5),有versionAtLeastversionAtMost测试功能。

使用示例:

!versionAtLeast(QT_VERSION, 5.11.2):error("Use at least Qt version 5.11.2")

PS:发布这个答案,因为简单的谷歌搜索“qmake check Qt version”没有带来这些参考(但这篇文章有)。

于 2018-10-07T13:54:41.193 回答
5

这是一个简单的测试。这就是我们在QtSerialPort以及 Qt 框架内的其他一些模块中一直在做的事情:

lessThan(QT_MAJOR_VERSION, 5) {
...
} else {
...
}

类似和常见的情况是:

contains(QT_MAJOR_VERSION, 5): ...

或者:

greaterThan(QT_MAJOR_VERSION, 4): ...

在这里,您可以找到我们一直在那里做的另一个 QtSerialPort 示例。

于 2013-09-06T23:14:19.533 回答