qmake 语言
许多 qmake 项目文件只是使用name = value
和name += value
定义列表来描述项目使用的源代码和头文件。qmake 还提供了其他运算符、函数和作用域,可用于处理变量声明中提供的信息。这些高级功能允许从一个项目文件为多个平台生成 Makefile。
操作符
在许多项目文件中,可以使用赋值 (=
) 和追加 (+=
) 操作符来包含项目的所有信息。典型的使用模式是为变量赋值,并根据各种测试的结果追加更多的值。由于 qmake 使用默认值定义了某些变量,因此有时需要使用删除 (-=
) 操作符来过滤掉不需要的值。下面几节将介绍如何使用操作符来操作变量的内容。
赋值
=
操作符为变量赋值:
TARGET = myapp
上一行将TARGET变量设置为myapp
。这将用myapp
覆盖之前为TARGET
设置的任何值。
附加值
+=
操作符将一个新值追加到变量的值列表中:
DEFINES += USE_MY_STUFF
上面一行将USE_MY_STUFF
添加到要放入生成的 Makefile 的预处理器定义列表中。
删除值
-=
操作符从变量的值列表中删除一个值:
DEFINES -= USE_MY_STUFF
上一行将USE_MY_STUFF
从预处理定义列表中删除,并放入生成的 Makefile 中。
添加唯一值
*=
操作符将一个值添加到变量的值列表中,但前提是该值尚未存在。这样可以防止变量中的值被多次包含。例如
DEFINES *= USE_MY_STUFF
在上面一行中,USE_MY_STUFF
只有在尚未定义的情况下才会被添加到预处理器定义列表中。请注意,unique()函数也可用于确保变量中每个值只包含一个实例。
替换值
~=
操作符将任何与正则表达式匹配的值替换为指定值:
DEFINES ~= s/QT_[DT].+/QT
在上面一行中,列表中以QT_D
或QT_T
开头的值都会被替换为QT
。
变量扩展
$$
操作符用于提取变量的内容,可用于在变量之间传递值或向函数提供值:
EVERYTHING = $$SOURCES $$HEADERS message("The project contains the following files:") message($$EVERYTHING)
变量可用于存储环境变量的内容。这些变量可在运行 qmake 时进行评估,或包含在生成的 Makefile 中,以便在联编项目时进行评估。
要在运行 qmake 时获取环境值的内容,可使用$$(...)
操作符:
DESTDIR = $$(PWD) message(The project will be installed in $$DESTDIR)
在上述赋值中,当处理项目文件时,将读取PWD
环境变量的值。
要在处理生成的 Makefile 时获取环境值的内容,请使用$(...)
操作符:
DESTDIR = $$(PWD) message(The project will be installed in $$DESTDIR) DESTDIR = $(PWD) message(The project will be installed in the value of PWD) message(when the Makefile is processed.)
在上述赋值中,当处理项目文件时,会立即读取PWD
的值,但在生成的 Makefile 中,会将$(PWD)
赋值给DESTDIR
。只要在处理 Makefile 时正确设置了环境变量,这将使编译过程更加灵活。
访问 qmake 属性
特殊的$$[...]
运算符可用于访问 qmake 属性:
message(Qt version: $$[QT_VERSION]) message(Qt is installed in $$[QT_INSTALL_PREFIX]) message(Qt resources can be found in the following locations:) message(Documentation: $$[QT_INSTALL_DOCS]) message(Header files: $$[QT_INSTALL_HEADERS]) message(Libraries: $$[QT_INSTALL_LIBS]) message(Binary files (executables): $$[QT_INSTALL_BINS]) message(Plugins: $$[QT_INSTALL_PLUGINS]) message(Data files: $$[QT_INSTALL_DATA]) message(Translation files: $$[QT_INSTALL_TRANSLATIONS]) message(Settings: $$[QT_INSTALL_CONFIGURATION]) message(Examples: $$[QT_INSTALL_EXAMPLES])
更多信息,请参阅配置 qmake。
使用此操作符访问的属性通常用于将第三方插件和组件集成到 Qt 中。例如,如果在Qt Widgets Designer 的项目文件中进行了以下声明,则可在安装内置插件的同时安装Qt Widgets Designer 插件:
target.path = $$[QT_INSTALL_PLUGINS]/designer INSTALLS += target
作用域
作用域类似于程序设计语言中的if
语句。如果某个条件为真,则处理作用域内的声明。
作用域语法
作用域由一个条件、同一行的开头括号、一系列命令和定义以及新一行的结尾括号组成:
<condition> { <command or definition> ... }
开头括号必须与条件写在同一行。如以下章节所述,作用域可以连接起来,以包含多个条件。
作用域和条件
作用域可以写成一个条件,后面跟一系列声明,这些声明包含在一对大括号中。例如
win32 { SOURCES += paintwidget_win.cpp }
在为 Windows 平台编译时,上述代码将把paintwidget_win.cpp
文件添加到生成的 Makefile 中列出的源代码中。为其他平台编译时,该定义将被忽略。
在给定作用域中使用的条件也可以被否定,以提供一组只有在原始条件为假时才会被处理的声明。例如,要在为除Windows之外的所有平台构建时处理某些内容,可以这样否定作用域:
!win32 { SOURCES -= paintwidget_win.cpp }
作用域可以嵌套,以组合多个条件。例如,要在启用调试后才在特定平台上包含特定文件,可写入以下内容:
macx { CONFIG(debug, debug|release) { HEADERS += debugging.h } }
为了节省编写许多嵌套作用域的时间,可以使用:
操作符嵌套作用域。上例中的嵌套作用域可按以下方式重写:
macx:CONFIG(debug, debug|release) { HEADERS += debugging.h }
您还可以使用:
操作符执行单行条件赋值。例如
win32:DEFINES += USE_MY_STUFF
只有在为 Windows 平台构建时,上面一行才会将USE_MY_STUFF
添加到DEFINES变量中。一般来说,:
运算符的作用类似于逻辑 AND 运算符,它将多个条件连接在一起,并要求所有条件均为真。
|
运算符的作用类似于逻辑 OR 运算符,它将多个条件连接在一起,但只要求其中一个条件为真。
win32|macx { HEADERS += debugging.h }
如果需要混合使用这两种运算符,可以使用if
函数来指定运算符优先级。
if(win32|macos):CONFIG(debug, debug|release) { # Do something on Windows and macOS, # but only for the debug configuration. } win32|if(macos:CONFIG(debug, debug|release)) { # Do something on Windows (regardless of debug or release) # and on macOS (only for debug). }
条件接受通配符,以匹配一系列CONFIG
值或 mkspec 名称。
win32-* { # Matches every mkspec starting with "win32-" SOURCES += win32_specific.cpp }
注意: 从历史上看,使用通配符检查 mkspec 名称是 qmake 检查平台的方法。现在,我们建议在QMAKE_PLATFORM
变量中使用 mkspec 定义的值。
您也可以使用else
作用域来提供作用域内的替代声明。如果前一个作用域的条件为假,则处理每个else
作用域。这样,您就可以结合其他作用域(如上,用:
运算符分隔)编写复杂的测试。例如
win32:xml { message(Building for Windows) SOURCES += xmlhandler_win.cpp } else:xml { SOURCES += xmlhandler.cpp } else { message("Unknown configuration") }
配置和作用域
qmake 会特别处理存储在CONFIG变量中的值。每个可能的值都可用作作用域的条件。例如,由CONFIG
保存的值列表可以用opengl
值来扩展:
CONFIG += opengl
这一操作的结果是,任何测试opengl
的作用域都将被处理。我们可以利用这一功能为最终可执行文件命名:
opengl { TARGET = application-gl } else { TARGET = application }
此功能可让我们轻松更改项目配置,而不会丢失特定配置可能需要的所有自定义设置。在上述代码中,第一个作用域中的声明已被处理,最终的可执行文件将被命名为application-gl
。但是,如果没有指定opengl
,则会处理第二个作用域中的声明,最终可执行文件将被调用为application
。
由于可以在CONFIG
行中加入自己的值,这就为您提供了一种定制项目文件和微调生成的 Makefile 的便捷方法。
平台范围值
除了在许多作用域条件中使用的win32
、macx
和unix
值外,还可以使用作用域测试其他各种内置的平台和编译器特定值。这些值基于 Qt 的mkspecs
目录中提供的平台规范。例如,项目文件中的以下几行显示了当前使用的规范,并对linux-g++
规范进行了测试:
message($$QMAKESPEC) linux-g++ { message(Linux) }
您可以测试任何其他平台-编译器组合,只要mkspecs
目录中存在相关规范即可。
变量
项目文件中使用的许多变量都是 qmake 在生成 Makefile 时使用的特殊变量,如DEFINES、SOURCES 和HEADERS。qmake 在遇到赋值时会用给定的变量名创建新变量。例如
MY_VARIABLE = value
qmake 对你自己的变量没有任何限制,除非在处理作用域时需要评估这些变量,否则 qmake 会忽略它们。
通过在变量名前加上 $$,你也可以将当前变量的值赋值给另一个变量。例如
MY_DEFINES = $$DEFINES
现在 MY_DEFINES 变量包含了项目文件中 DEFINES 变量的内容。这也相当于
MY_DEFINES = $${DEFINES}
第二种符号允许将变量内容追加到另一个值中,而不用空格分隔。例如,下文将确保最终可执行文件的名称包含正在使用的项目模板:
TARGET = myproject_$${TEMPLATE}
替换函数
qmake 提供了一系列内置函数来处理变量的内容。这些函数处理提供给它们的参数,并返回一个值或一系列值作为结果。要将结果赋值给变量,请使用$$
运算符和此类函数,就像将一个变量的内容赋值给另一个变量一样:
HEADERS = model.h HEADERS += $$OTHER_HEADERS HEADERS = $$unique(HEADERS)
这类函数应在赋值的右侧使用(即作为操作数)。
你可以定义自己的函数来处理变量的内容,如下所示:
defineReplace(functionName){ #function code }
下面的示例函数将变量名作为唯一参数,使用内置函数eval()从变量中提取一系列值,然后编译一系列文件:
defineReplace(headersAndSources) { variable = $$1 names = $$eval($$variable) headers = sources = for(name, names) { header = $${name}.h exists($$header) { headers += $$header } source = $${name}.cpp exists($$source) { sources += $$source } } return($$headers $$sources) }
测试函数
qmake 提供了内置函数,可在编写作用域时用作条件。这些函数不返回值,而是指示成功或失败:
count(options, 2) { message(Both release and debug specified.) }
这类函数只能在条件表达式中使用。
您可以定义自己的函数,为作用域提供条件。下面的示例测试列表中的每个文件是否存在,如果都存在则返回 true,如果不存在则返回 false:
defineTest(allFiles) { files = $$ARGS for(file, files) { !exists($$file) { return(false) } } return(true) }
© 2025 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.