测试函数
测试函数返回一个布尔值,您可以在作用域的条件部分中对此值进行检测。测试函数可分为内置函数和函数库。
另请参阅“替换函数”。
内置测试函数
基本测试函数以内置函数的形式实现。
cache(变量名, [set|add|sub] [transient] [super|stash], [源变量名])
这是一个内部函数,通常您无需使用它。
该函数是在 Qt 5.0 中引入的。
CONFIG(config)
此函数可用于测试放置在CONFIG变量中的变量。 这与 scopes 相同,但额外具有一个优势:可以传递第二个参数来测试当前有效的配置。由于在CONFIG 变量中值的顺序很重要(即对于互斥值,最后设置的值将被视为当前有效的配置),因此可以使用第二个参数来指定要考虑的一组值。例如:
CONFIG = debug
CONFIG += release
CONFIG(release, debug|release):message(Release build!) #will print
CONFIG(debug, debug|release):message(Debug build!) #no print由于“release”被视为活动设置(用于功能解析),因此它将成为生成构建文件时使用的 CONFIG。在常见情况下无需第二个参数,但对于特定的互斥测试而言,它却不可或缺。
contains(变量名, 值)
如果变量variablename 包含值value ,则成功;否则失败。可以为参数value 指定正则表达式。
您可以使用作用域来检查此函数的返回值。
例如:
contains( drivers, network ) {
# drivers contains 'network'
message( "Configuring for network build..." )
HEADERS += network.h
SOURCES += network.cpp
}只有当变量drivers 包含值network 时,才会处理该作用域的内容。若满足此条件,相应的文件将被添加到SOURCES和HEADERS变量中。
count(variablename, number)
如果变量variablename 包含一个具有指定number 值的列表,则执行成功;否则失败。
此函数用于确保只有当变量包含正确数量的值时,才处理作用域内的声明。例如:
options = $$find(CONFIG, "debug") $$find(CONFIG, "release")
count(options, 2) {
message(Both release and debug specified.)
}debug(level, message)
检查 qmake 是否在指定的调试级别下运行。如果是,则返回 true 并打印一条调试消息。
defined(name[, type])
测试函数或变量name 是否已定义。若省略type ,则检查所有函数。若仅需检查变量或特定类型的函数,请指定type 。其取值范围如下:
test仅检查测试函数replace仅检查替换函数var仅检查变量
equals(variablename, value)
测试variablename 是否等于字符串value 。
例如:
TARGET = helloworld
equals(TARGET, "helloworld") {
message("The target assignment was successful.")
}error(string)
该函数永远不会返回任何值。qmake 会向用户显示string 作为错误信息,并退出程序。该函数仅应用于无法恢复的错误。
例如:
error(An error has occurred in the configuration process.)eval(string)
使用 qmake 语法规则评估字符串的内容,并返回 true。字符串中可以使用定义和赋值语句来修改现有变量的值或创建新定义。
例如:
eval(TARGET = myapp) {
message($$TARGET)
}注意: 可以使用引号 来限定字符串,如果不需要返回值,可以忽略它。
exists(filename)
测试是否存在名为filename 的文件。如果文件存在,函数返回成功;否则返回失败。
filename 参数可以包含通配符。在这种情况下,只要有任何文件匹配,该函数即返回成功。
例如:
exists( $(QTDIR)/lib/libqt-mt* ) {
message( "Configuring for multi-threaded Qt..." )
CONFIG += thread
}注意: 无论使用何种平台,都应使用“ /”作为目录分隔符。
export(variablename)
将variablename 的当前值从函数的局部作用域导出到全局作用域。
for(迭代器, 列表)
启动一个循环,遍历list 中的所有值,并依次将iterate 设置为每个值。为方便起见,如果list 为1..10,则iterate将遍历1到10之间的值。
例如:
LIST = 1 2 3
for(a, LIST):exists(file.$${a}):message(I see a file.$${a}!)可以通过break() 中断循环。next() 语句会跳过循环体剩余部分,并从下一次迭代继续执行。
greaterThan(变量名, 值)
用于检测variablename 的值是否大于value 。首先,该函数尝试进行数值比较。如果至少有一个操作数无法转换,则该函数将进行字符串比较。
例如:
ANSWER = 42
greaterThan(ANSWER, 1) {
message("The answer might be correct.")
}无法直接将两个数字作为字符串进行比较。作为变通方法,可以构建带有非数字前缀的临时值,然后对这些值进行比较。
例如:
VALUE = 123
TMP_VALUE = x$$VALUE
greaterThan(TMP_VALUE, x456): message("Condition may be true.")另请参阅lessThan()。
if(condition)
计算condition 。用于对布尔表达式进行分组。
例如:
if(linux-g++*|macx-g++*):CONFIG(debug, debug|release) {
message("We are on Linux or Mac OS, and we are in debug mode.")
}include(filename)
将由filename 指定的文件内容包含到当前项目中,位置即为包含该文件的位置。如果已包含filename ,则该函数成功;否则失败。被包含的文件将立即被处理。
您可以通过将此函数用作作用域的条件来检查文件是否已被包含。例如:
include( shared.pri )
OPTIONS = standard custom
!include( options.pri ) {
message( "No custom build options specified" )
OPTIONS -= custom
}infile(filename, var, val)
如果文件filename (由 qmake 自身解析时)包含变量var 且其值为val ,则该函数成功;否则失败。若未指定val ,则该函数会检测文件中是否已赋值var 。
isActiveConfig
这是CONFIG 函数的别名。
isEmpty(variablename)
如果变量variablename 为空,则成功;否则失败。这等同于count( variablename, 0 ) 。
例如:
isEmpty( CONFIG ) {
CONFIG += warn_on debug
}isEqual
这是equals 函数的别名。
lessThan(变量名, 值)
用于检测variablename 的值是否小于value 。其作用与greaterThan() 相同。
例如:
ANSWER = 42
lessThan(ANSWER, 1) {
message("The answer might be wrong.")
}load(feature)
加载由 `feature` 指定的特征文件(.prf ),除非该特征已加载。
log(message)
在控制台输出消息。与message 函数不同,该函数既不添加前缀文本,也不在末尾添加换行符。
该函数在 Qt 5.0 中引入。
另请参阅message()。
message(string)
该函数始终成功执行,并向用户显示string 作为通用消息。与error() 函数不同,该函数允许后续处理继续进行。
message( "This is a message" )上述代码会将“This is a message”写入控制台。引号的使用是可选的,但建议使用。
注意:默认情况下,对于 qmake 为给定项目生成的每个 Makefile,都会 输出相应消息。若要确保每个项目仅显示一次消息,请结合作用域对`build_pass ` 变量进行检测,以便在构建过程中过滤消息。例如:
!build_pass:message( "This is a message" )mkpath(dirPath)
创建目录路径dirPath 。该函数是QDir::mkpath 函数的封装。
该函数于 Qt 5.0 中引入。
requires(condition)
评估表达式condition 。如果条件为假,qmake 在构建时将跳过该项目(及其子目录)。
注意:您 也可以使用REQUIRES变量来实现此目的。不过,我们建议改用此函数。
system(command)
在二级 shell 中执行给定的command 。如果命令返回零退出状态,则执行成功;否则失败。您可以使用作用域来检查该函数的返回值。
例如:
system("ls /bin"): HAS_BIN = TRUE另请参阅system() 的 replace 变体。
touch(filename, reference_filename)
将filename 的时间戳更新为与reference_filename 的时间戳一致。
该函数在 Qt 5.0 中引入。
unset(变量名)
从当前上下文中移除 `variablename `。
例如:
NARF = zort
unset(NARF)
!defined(NARF, var) {
message("NARF is not defined.")
}versionAtLeast(变量名, 版本号)
用于检验variablename 中的版本号是否大于或等于versionNumber 。版本号被视为由“.”分隔的非负十进制数序列;字符串中任何非数字的尾部内容将被忽略。 比较按段从左到右进行;如果一个版本是另一个版本的前缀,则认为其较小。
该函数在 Qt 5.10 中引入。
versionAtMost(variablename, versionNumber)
用于检测variablename 中的版本号是否小于或等于versionNumber 。其工作原理与versionAtLeast()相同。
该函数在 Qt 5.10 中引入。
warning(string)
该函数始终成功执行,并将string 作为警告消息显示给用户。
write_file(filename, [variablename, [mode]])
将variablename 中的值写入名为filename 的文件中,每个值占一行。如果未指定variablename ,则创建一个空文件。如果mode 为append 且文件已存在,则追加内容而非覆盖原文件。
该函数在 Qt 5.0 中引入。
测试函数库
复杂的测试函数通过 .prf 文件库实现。
packagesExist(packages)
使用 PKGCONFIG 机制来确定在项目解析时给定的软件包是否存在。
这可用于选择性地启用或禁用某些功能。例如:
packagesExist(sqlite3 QtNetwork QtDeclarative) {
DEFINES += USE_FANCY_UI
}然后,在代码中:
#ifdef USE_FANCY_UI
// Use the fancy UI, as we have extra packages available
#endifprepareRecursiveTarget(target)
通过准备一个遍历所有子目录的目标,有助于创建类似于install 目标的项目级目标。例如:
TEMPLATE = subdirs
SUBDIRS = one two three
prepareRecursiveTarget(check)在 .CONFIG 文件中指定了 `have_no_default ` 或 `no_<target>_target ` 的子目录将被排除在此目标之外:
two.CONFIG += no_check_target您必须手动将准备好的目标添加到QMAKE_EXTRA_TARGETS 中:
QMAKE_EXTRA_TARGETS += check要使该目标成为全局目标,上述代码需包含在每个子目录子项目中。此外,为了使这些目标生效,非子目录子项目也需要包含相应的代码。实现这一点最简单的方法是创建一个自定义功能文件。例如:
# <project root>/features/mycheck.prf
equals(TEMPLATE, subdirs) {
prepareRecursiveTarget(check)
} else {
check.commands = echo hello user
}
QMAKE_EXTRA_TARGETS += check该特性文件需要注入到每个子项目中,例如通过 .qmake.conf 实现:
# <project root>/.qmake.conf
CONFIG += mycheck此功能在 Qt 5.0 中引入。
qtCompileTest(test)
构建一个测试项目。如果测试通过,则返回 true 并将 `config_<test> ` 添加到CONFIG变量中;否则,返回 false。
要使用此函数,需要加载相应的特性文件:
# <project root>/project.pro
load(configure)这同时会将变量 QMAKE_CONFIG_TESTS_DIR 设置为项目父目录下的config.tests 子目录。加载功能文件后,可以覆盖此值。
在 tests 目录中,每个测试必须有一个子目录,其中包含一个简单的 qmake 项目。以下代码片段展示了该项目的 .pro 文件:
# <project root>/config.tests/test/test.pro
SOURCES = main.cpp
LIBS += -ltheFeature
# Note that the test project is built without Qt by default.以下代码片段展示了该项目的主 .cpp 文件:
// <project root>/config.tests/test/main.cpp
#include <TheFeature/MainHeader.h>
int main() { return featureFunction(); }以下代码片段展示了测试的调用方式:
# <project root>/project.pro
qtCompileTest(test)如果测试项目构建成功,则测试通过。
测试结果会自动缓存,所有子项目均可访问这些结果。因此,建议在顶级项目文件中运行所有配置测试。
若要禁止复用缓存结果,请向 qmake 传递 `CONFIG+=recheck ` 参数。
另请参阅load()。
该函数在 Qt 5.0 中引入。
qtHaveModule(name)
检查由name 指定的 Qt 模块是否存在。有关可能值的列表,请参阅QT。
该函数在 Qt 5.0.1 中引入。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.