我安装了多个版本的 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 文件中不存在。
有没有更好的方法来做同样的事情?
您可以在此处使用条件函数和范围:
QT_VERSION = 5 # this can be 4, set manually
equals(QT_VERSION, 5){
QT += widgets
}
equals(QT_VERSION, 4) {
QT += gui
}
但是,您需要在原始代码中注意以下几点:
明确定义 Qt 版本不是必需的,如果您忘记在 .pro 文件中更改它可能会让您头疼。相反,qmake 会自动QT_MAJOR_VERSION
为您定义一个变量。
在这种情况下使用equals
将起作用。但是,如下所述,equals
执行字符串比较。但是,最好使用它greaterThan
,lessThan
因为当您尝试使用 Qt 6(将来某个地方)编译它时,您的代码将自动停止工作。
不需要添加gui
,因为它默认包含在内。QT
所以,你的代码应该是:
greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets
}
以下是一些未记录的qmake
宝石:
defined(func, type)
func
如果已定义,则返回 true ;type 必须是test
or replace
,以匹配defineTest
or 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。
您可以像这样在一行中进行检查:
equals(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 5) {
QT += bluetooth
} else {
message(Qt $$QT_VERSION Bluetooth not supported.)
}
!lessThan
there 代表更大或相等。
不确定从什么时候开始(我猜是 Qt5),有versionAtLeast和versionAtMost测试功能。
使用示例:
!versionAtLeast(QT_VERSION, 5.11.2):error("Use at least Qt version 5.11.2")
PS:发布这个答案,因为简单的谷歌搜索“qmake check Qt version”没有带来这些参考(但这篇文章有)。
这是一个简单的测试。这就是我们在QtSerialPort以及 Qt 框架内的其他一些模块中一直在做的事情:
lessThan(QT_MAJOR_VERSION, 5) {
...
} else {
...
}
类似和常见的情况是:
contains(QT_MAJOR_VERSION, 5): ...
或者:
greaterThan(QT_MAJOR_VERSION, 4): ...
在这里,您可以找到我们一直在那里做的另一个 QtSerialPort 示例。