我安装了多个版本的Qt,我需要用它们编译我的项目 使用专业文件,我在文档中找不到如何进行条件编译。
理想情况下,这就是我想要做的事情:
QT_VERSION = 5 # this can be 4, set manually
if(QT_VERSION == 5) {
QT += widgets
}
if(QT_VERSION == 4) {
QT += gui
}
当然,pro文件中不存在if()命令 是否有更好的方法来做同样的事情?
答案 0 :(得分:22)
您可以在此处使用条件函数和范围:
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
}
以下是一些undocumented qmake
gems:
defined(func, type)
如果定义了func
,则返回true;类型必须为test
或replace
,以匹配defineTest
或defineReplace
。
equals(var1, var)
(也适用于isEqual
)
如果var1等于var2(字符串比较),则返回true。
lessThan(var1, var2)`
如果var1
小于var2
(作为整数),则返回true。
greaterThan(var1, var2)
如果var1
大于var2
(作为整数),则返回true。
inFile(file, var, val)
如果在指定文件中定义了变量var
,则返回true。此外,它可以测试它是否具有请求的值。
load(string)
include()
和CONFIG += [feature]
之间的某种交叉。 load(foo)
将在标准功能路径中查找名为“foo.prf”的文件,并立即执行其内容。 {。1}}中包含的功能在“.pro”文件处理完毕后最后执行。与CONFIG
类似,如果找到该文件,它将返回true。
答案 1 :(得分:6)
不知道自从什么时候开始(我猜是Qt5),就有versionAtLeast和versionAtMost测试功能。
用法示例:
!versionAtLeast(QT_VERSION, 5.11.2):error("Use at least Qt version 5.11.2")
P.S .:发布此答案,因为简单地使用谷歌搜索“ qmake check Qt版本”不会带来这些引用(但这篇文章会带来这种影响)。
答案 2 :(得分:4)
您可以在一行中进行检查:
equals(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 5) {
QT += bluetooth
} else {
message(Qt $$QT_VERSION Bluetooth not supported.)
}
!lessThan
代表更大或相等。
答案 3 :(得分:3)
这是一个简单的测试。这就是我们在QtSerialPort中所做的以及Qt框架内的其他一些模块:
lessThan(QT_MAJOR_VERSION, 5) {
...
} else {
...
}
类似和常见的条件是:
contains(QT_MAJOR_VERSION, 5): ...
或:
greaterThan(QT_MAJOR_VERSION, 4): ...
Here你可以找到我们在那里做过的另一个QtSerialPort示例。