替换函数
qmake 提供了在配置过程中处理变量内容的函数。这些函数被称为替换函数。通常,它们返回的值可以赋给其他变量。您可以通过在函数名前添加$$ 运算符来获取这些值。替换函数可分为内置函数和函数库。
另请参阅“测试函数”。
内置替换函数
基本替换函数以内置函数的形式实现。
absolute_path(path[, base])
返回path 的绝对路径。
如果未指定 `base `,则使用当前目录作为基目录。如果是相对路径,则在使用前会将其解析为相对于当前目录的路径。
例如,以下调用将返回字符串 `"/home/johndoe/myproject/readme.txt"`:
message($$absolute_path("readme.txt", "/home/johndoe/myproject"))该函数在 Qt 5.0 中引入。
另请参阅clean_path()、relative_path()。
basename(variablename)
返回variablename 中指定的文件的基名。
例如:
FILE = /etc/passwd
FILENAME = $$basename(FILE) #passwdcat(filename[, mode])
返回filename 的内容。您可以为mode 指定以下选项:
blob将文件的全部内容作为单个值返回lines将每行作为单独的值返回(不包含换行符)true(默认值)和false会将文件内容作为独立的值返回,并根据qmake值列表拆分规则(如变量赋值中的规则)进行拆分。如果mode为false,则会将仅包含换行符的值插入列表中,以标示文件中的换行位置。
clean_path(path)
返回path ,其中目录分隔符已规范化(转换为“/”),冗余分隔符已被移除,且“.”和“..”已被解析(尽可能地)。该函数是QDir::cleanPath 的封装函数。
该函数在 Qt 5.0 中引入。
另请参阅absolute_path()、relative_path()、shell_path()、system_path()。
dirname(file)
返回指定文件中的目录名称部分。例如:
FILE = /etc/X11R6/XF86Config
DIRNAME = $$dirname(FILE) #/etc/X11R6enumerate_vars
返回所有已定义变量名的列表。
该函数在 Qt 5.0 中引入。
escape_expand(arg1 [, arg2 ..., argn])
接受任意数量的参数。它会针对每个参数展开转义序列\n 、\r 、\t ,并将参数作为列表返回。
注意:如果 直接指定要展开的字符串,则需要对反斜杠进行转义,如下面的代码片段所示:
message("First line$$escape_expand(\\n)Second line")find(variablename, substr)
返回variablename 中所有匹配正则表达式substr 的值。
MY_VAR = one two three four
MY_VAR2 = $$join(MY_VAR, " -L", -L) -Lfive
MY_VAR3 = $$member(MY_VAR, 2) $$find(MY_VAR, t.*)MY_VAR2 将包含 '-Lone -Ltwo -Lthree -Lfour -Lfive',而 MY_VAR3 将包含 'three two three'。
files(pattern[, recursive=false])
展开指定的通配符模式,并返回一个文件名列表。如果recursive 为真,则该函数会向下遍历子目录。
first(变量名)
返回variablename 的第一个值。
例如,以下调用将返回firstname :
CONTACT = firstname middlename surname phone
message($$first(CONTACT))另请参阅take_first()、last()。
format_number(number[, options...])
返回符合 `options` 指定格式的 `number `。您可以指定以下选项:
ibase=n将输入的进制设置为nobase=n将输出的基数设置为nwidth=n将输出的最小宽度设置为n。如果输出长度小于width,则用空格补足zeropad用零而非空格对输出进行补齐padsign在输出中的正数前面添加一个空格alwayssign在输出中的正数前面添加一个加号leftalign将填充字符置于输出值的右侧
目前不支持浮点数。
例如,以下调用将十六进制数BAD 转换为002989 :
message($$format_number(BAD, ibase=16 width=6 zeropad))该函数在 Qt 5.0 中引入。
fromfile(filename, variablename)
将filename 作为qmake项目文件进行解析,并返回赋值给variablename 的值。
另请参阅infile()。
getenv(variablename)
返回环境变量variablename 的值。这基本上等同于$$(variablename) 语法。不过,getenv 函数支持名称中包含圆括号的环境变量。
该函数在 Qt 5.12 中引入。
join(变量名, 连接符, 前缀, 后缀)
将variablename 的值与glue 连接起来。如果该值不为空,则该函数会在值的前面添加before ,并在后面添加after 。variablename 是唯一必需的参数,其余参数默认值为空字符串。若需在glue 、before 或after 中编码空格,必须用引号将其括起来。
last(变量名)
返回variablename 的最后一个值。
例如,以下调用将返回phone :
CONTACT = firstname middlename surname phone
message($$last(CONTACT))另请参阅take_last()、first()。
list(arg1 [, arg2 ..., argn])
接受任意数量的参数。它会创建一个具有唯一名称的变量,该变量包含所有参数组成的列表,并返回该变量的名称。您可以使用该变量编写循环,如下面的代码片段所示
for(var, $$list(foo bar baz)) {
...
},而不是:
values = foo bar baz
for(var, values) {
...
}lower(arg1 [, arg2 ..., argn])
接受任意数量的参数,并将它们转换为小写。
另请参阅upper()。
member(variablename [, start [, end]])
返回列表值variablename 的一个切片,其中元素索引(从零开始)位于start 到end 之间(包含端点)。
如果未指定 `start `,则默认值为零。此用法等同于 `$$first(variablename)`。
如果未指定end ,则默认值为start 。此用法代表简单的数组索引,因为将返回且仅返回一个元素。
也可以将起始索引和结束索引作为单个参数指定,数字之间用两个句点分隔。
负数表示从列表末尾开始的索引,其中 -1 表示最后一个元素。
如果任一索引超出范围,则返回一个空列表。
如果end 小于start ,则元素将按相反的顺序返回。
注意:由于 结束索引是包含的且无序的,这意味着 只有当索引无效时(由输入变量为空所暗示),才会返回一个空列表。
另请参阅str_member()。
num_add(arg1 [, arg2 ..., argn])
接受任意数量的数值参数并将其相加,返回和。
由于可以通过在数值前直接添加负号来取反,因此隐式支持减法:
sum = $$num_add($$first, -$$second)如果操作数可能已经是负数,则需要额外一步来对数值进行标准化:
second_neg = -$$second
second_neg ~= s/^--//
sum = $$num_add($$first, $$second_neg)该函数在 Qt 5.8 中引入。
prompt(question [, decorate])
显示指定的question ,并返回从标准输入(stdin)读取的值。
如果decorate 为true(默认值),则问题会添加通用前缀和后缀,以标识其为提示。
quote(string)
将整个string 转换为单个实体,并返回结果。这只不过是将字符串用双引号括起来的一种花哨写法。
re_escape(string)
返回一个string ,其中每个特殊正则表达式字符均用反斜杠转义。该函数是QRegularExpression::escape 的封装。
read_registry(tree, key[, flag])
返回树tree 内注册表键key 的值。
仅支持树HKEY_CURRENT_USER (HKCU )和HKEY_LOCAL_MACHINE (HKLM )。
flag 可以是WOW64_32KEY (32 )或WOW64_64KEY (64 )。
注意:此 函数仅在 Windows 主机上可用。
该函数在 Qt 5.12.1 中引入。
relative_path(filePath[, base])
返回相对于base 的filePath 的路径。
如果未指定base ,则默认为当前项目目录。如果是相对路径,则在使用前会相对于当前项目目录进行解析。
如果 `filePath ` 是相对路径,则首先根据基目录进行解析;在这种情况下,该函数实际上相当于 `$$clean_path()`。
该函数在 Qt 5.0 中引入。
另请参阅absolute_path()、clean_path()。
replace(string, old_string, new_string)
将作为string 参数提供的变量内容中,所有old_string 替换为new_string 。例如,以下代码
MESSAGE = This is a tent.
message($$replace(MESSAGE, tent, test))将输出以下消息:
This is a test.resolve_depends(variablename, prefix)
这是一个内部函数,通常您无需使用它。
该函数在 Qt 5.0 中引入。
reverse(variablename)
按反向顺序返回variablename 的值。
该函数在 Qt 5.0 中引入。
section(variablename, separator, begin, end)
返回variablename 值的某个片段。该函数是QString::section 的封装函数。
例如,以下调用将输出surname :
CONTACT = firstname:middlename:surname:phone
message($$section(CONTACT, :, 2, 2))shadowed(path)
将项目源代码目录中的路径映射到构建目录。对于源内构建,该函数返回path ;若path 指向源代码树之外,则返回空字符串。
该函数在 Qt 5.0 中引入。
shell_path(path)
将 `path ` 中的所有目录分隔符转换为与项目构建时所用 shell(即由 make 工具调用的 shell)兼容的分隔符。例如,当使用 Windows shell 时,斜杠会被转换为反斜杠。
该函数在 Qt 5.0 中引入。
另请参阅system_path()。
shell_quote(arg)
将arg 进行引号封装,以适应项目构建时使用的 shell。
该函数在 Qt 5.0 中引入。
另请参阅system_quote()。
size(variablename)
返回 `variablename` 的值个数。
另请参阅str_size()。
sort_depends(variablename, prefix)
这是一个内部函数,通常您无需使用它。
该函数在 Qt 5.0 中引入。
sorted(variablename)
返回variablename 中按升序 ASCII 顺序排序的值列表。
可以通过借助format_number()函数将数值用零填充至固定长度来实现数值排序。
该函数在 Qt 5.8 中引入。
split(variablename, separator)
将variablename 的值拆分为多个独立的值,并将其作为列表返回。该函数是QString::split 的封装。
例如:
CONTACT = firstname:middlename:surname:phone
message($$split(CONTACT, :))sprintf(string, arguments...)
将string 中的%1-%9替换为函数arguments 的逗号分隔参数列表,并返回处理后的字符串。
str_member(arg [, start [, end]])
该函数与member() 完全相同,只是它操作的是字符串值而非列表变量,因此索引指的是字符位置。
该函数可用于实现许多常见的字符串切片操作:
# $$left(VAR, len)
left = $$str_member(VAR, 0, $$num_add($$len, -1))
# $$right(VAR, len)
right = $$str_member(VAR, -$$num, -1)
# $$mid(VAR, off, len)
mid = $$str_member(VAR, $$off, $$num_add($$off, $$len, -1))
# $$mid(VAR, off)
mid = $$str_member(VAR, $$off, -1)
# $$reverse(VAR)
reverse = $$str_member(VAR, -1, 0)注意:在 这些实现中,需要单独处理零len 参数。
该函数在 Qt 5.8 中引入。
str_size(arg)
返回参数中的字符数。
另请参阅size()。
该函数在 Qt 5.8 中引入。
system(command[, mode[, stsvar]])
您可以使用system 函数的此变体,从命令中获取标准输出并将其赋值给一个变量。
例如:
UNAME = $$system(uname -s)
contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me )与$$cat() 类似,mode 的参数可取以下值:blob 、lines 、true 以及false 。不过,旧版单词分割规则(即空字符串、true 和false )存在细微差异。
若传入stsvar ,该变量的值将存储命令的退出状态。若命令崩溃,状态值为-1;否则,状态值为命令自行决定的非负退出代码。通常,将状态值与零(成功)进行比较即可。
另请参阅system() 的 test 变体。
system_path(path)
将path 中的所有目录分隔符转换为与system() 函数用于调用命令的shell兼容的分隔符。例如,在Windows shell中,斜杠会被转换为反斜杠。
该函数在 Qt 5.0 中引入。
另请参阅shell_path()。
system_quote(arg)
将arg 进行引号处理,以适应system() 函数所使用的 shell。
该函数自 Qt 5.0 起引入。
另请参见shell_quote()。
take_first(variablename)
返回 `variablename ` 的第一个值,并将其从源变量中移除。
这为实现队列等提供了便利。
该函数在 Qt 5.8 中引入。
另请参阅take_last()、first()。
take_last(变量名)
返回 `variablename ` 的最后一个值,并将其从源变量中移除。
这为实现栈等提供了便利。
该函数在 Qt 5.8 中引入。
另请参阅take_first()、last()。
unique(变量名)
返回variablename 中值列表,其中已移除重复项。例如:
ARGS = 1 2 3 2 5 1
ARGS = $$unique(ARGS) #1 2 3 5upper(arg1 [, arg2 ..., argn])
接受任意数量的参数,并将它们转换为大写。
另请参阅lower()。
val_escape(变量名)
对 `variablename ` 中的值进行转义处理,使其能够作为 qmake 代码进行解析。
该函数在 Qt 5.0 中引入。
© 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.