高级用法
添加新的配置功能
qmake 允许您创建自己的features ,通过将这些文件的名称添加到CONFIG变量指定的值列表中,即可将其包含在项目文件中。这些功能是位于多个标准目录之一中的.prf 文件内自定义函数和定义的集合。 这些目录的位置在多个位置中定义,qmake在查找.prf 文件时会按以下顺序逐一检查:
- 在
QMAKEFEATURES环境变量中列出的目录中,该变量包含以平台路径列表分隔符(Unix 为冒号,Windows 为分号)分隔的目录列表。 - 在
QMAKEFEATURES属性变量中列出的目录中,该变量包含以平台路径列表分隔符分隔的目录列表。 - 位于
mkspecs目录内的features目录中。mkspecs目录可以位于QMAKEPATH环境变量所列的任意目录之下,该变量包含以平台路径列表分隔符分隔的目录列表。例如:$QMAKEPATH/mkspecs/<features>。 - 位于由QMAKESPEC环境变量指定的目录下的 features 目录中。例如:
$QMAKESPEC/<features>。 - 位于
data_install/mkspecs目录下的 features 目录中。例如:data_install/mkspecs/<features>。 - 位于与
QMAKESPEC环境变量指定的目录同级的features目录中。例如:$QMAKESPEC/../<features>。
系统将搜索以下 features 目录以查找 features 文件:
features/unix,features/win32或features/macx,具体取决于所使用的平台features/
例如,请看项目文件中的以下赋值:
CONFIG += myfeatures在CONFIG 变量中添加此内容后,qmake在完成项目文件的解析后,将搜索上述位置以查找myfeatures.prf 文件。在Unix系统上,它将查找以下文件:
$QMAKEFEATURES/myfeatures.prf(针对QMAKEFEATURES环境变量中列出的每个目录)$$QMAKEFEATURES/myfeatures.prf(针对QMAKEFEATURES属性变量中列出的每个目录)myfeatures.prf(在项目的根目录中)。项目的根目录由顶级.pro文件确定。但是,如果您将.qmake.cache文件放置在子目录或子项目的目录中,则该子目录本身将成为项目的根目录。$QMAKEPATH/mkspecs/features/unix/myfeatures.prf以及$QMAKEPATH/mkspecs/features/myfeatures.prf(针对QMAKEPATH环境变量中列出的每个目录)$QMAKESPEC/features/unix/myfeatures.prf以及$QMAKESPEC/features/myfeatures.prfdata_install/mkspecs/features/unix/myfeatures.prf以及data_install/mkspecs/features/myfeatures.prf$QMAKESPEC/../features/unix/myfeatures.prf以及$QMAKESPEC/../features/myfeatures.prf
注意: .prf 文件的 名称必须为小写。
安装文件
在 Unix 系统中,通常也会使用构建工具来安装应用程序和库;例如,通过调用 `make install`。因此,qmake 引入了“安装对象”(install set )的概念,该对象包含关于项目某一部分应如何安装的指令。例如,一组文档文件可以按以下方式进行描述:
documentation.path = /usr/local/program/doc
documentation.files = docs/*path 成员告知 qmake 应将文件安装在/usr/local/program/doc (path 成员)中,而files 成员则指定了应复制到安装目录中的文件。在此示例中,docs 目录中的所有内容都将被复制到/usr/local/program/doc 。
一旦安装集被完整描述,您可以通过如下行将其追加到安装列表中:
INSTALLS += documentationqmake 将确保指定的文件被复制到安装目录。如果您需要对该过程进行更多控制,还可以为该对象的extra 成员提供定义。例如,以下这一行告诉 qmake 为该安装集执行一系列命令:
unix:documentation.extra = create_docs; mv master.doc toc.docunix 作用域确保这些特定命令仅在 Unix 平台上执行。针对其他平台的相应命令可通过其他作用域规则进行定义。
在 `extra ` 成员中指定的命令将在对象中其他成员的指令执行之前被执行。
如果您将一个内置安装集附加到 `INSTALLS ` 变量上,且未指定 `files ` 或 `extra ` 成员,qmake 将自动为您决定需要复制的内容。目前支持 `target ` 和 `dlltarget ` 安装集。例如:
target.path = /usr/local/myprogram
INSTALLS += target在上述代码行中,qmake 会自动识别需要复制的内容,并自动处理安装过程。
添加自定义目标
qmake 力求满足对跨平台构建工具的所有预期功能。但当您确实需要运行特殊的平台依赖命令时,这种做法往往并不理想。您可以通过向不同的 qmake 后端提供特定指令来实现这一点。
Makefile 输出的自定义是通过 qmake 其他地方常见的对象式 API 实现的。通过指定其成员,对象会自动定义。例如:
mytarget.target = .buildfile
mytarget.commands = touch $$mytarget.target
mytarget.depends = mytarget2
mytarget2.commands = @echo Building $$mytarget.target上述定义创建了一个名为mytarget 的qmake目标,其中包含一个名为.buildfile 的Makefile目标,该目标又通过touch 命令生成。最后,.depends 成员指定了mytarget 依赖于mytarget2 ——后者是随后定义的另一个目标。mytarget2 是一个虚拟目标,仅用于将某些文本输出到控制台。
最后一步是使用QMAKE_EXTRA_TARGETS 变量来指示qmake,该对象是一个待构建的目标:
QMAKE_EXTRA_TARGETS += mytarget mytarget2这就是实际构建自定义目标所需做的全部操作。当然,您可能希望将其中一个目标与qmake 构建目标关联起来。要做到这一点,只需将您的 Makefile 目标包含在PRE_TARGETDEPS 列表中即可。
自定义目标规范支持以下成员:
| 成员 | 描述 |
|---|---|
| commands | 用于生成自定义构建目标的命令。 |
| CONFIG | 自定义构建目标的特定配置选项。可设置为recursive ,以指示应在Makefile中创建规则,从而调用子目标专用Makefile中的相关目标。该成员默认会为每个子目标创建一个条目。 |
| depends | 自定义构建目标所依赖的现有构建目标。 |
| recurse | 指定在 Makefile 中创建规则以调用子目标专用 Makefile 时,应使用哪些子目标。此成员仅在CONFIG 中设置了recursive 时才被使用。典型值包括“Debug”和“Release”。 |
| recurse_target | 指定应通过子目标 Makefile 为 Makefile 中的规则构建的目标。该成员会添加类似$(MAKE) -f Makefile.[subtarget] [recurse_target] 的内容。仅当在CONFIG 中设置了recursive 时,才会使用该成员。 |
| target | 自定义构建目标的名称。 |
添加编译器
可以自定义 qmake 以支持新的编译器和预处理器:
new_moc.output = moc_${QMAKE_FILE_BASE}.cpp
new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,,"
new_moc.input = NEW_HEADERS
QMAKE_EXTRA_COMPILERS += new_moc通过上述定义,如果存在 moc 的替代方案,您可以直接使用它。该命令将对传递给NEW_HEADERS 变量(来自input 成员)的所有参数进行处理,并将结果写入由output 成员定义的文件中。该文件将被添加到项目中的其他源文件中。 此外,qmake 还会执行depend_command 来生成依赖关系信息,并将该信息也纳入项目中。
自定义编译器规范支持以下成员:
| 成员 | 描述 |
|---|---|
| commands | 用于根据输入生成输出的命令。 |
| CONFIG | 自定义编译器的特定配置选项。详情请参阅 CONFIG 表。 |
| depend_command | 指定用于生成输出依赖项列表的命令。 |
| dependency_type | 指定输出文件的类型。如果是已知类型(如 TYPE_C、TYPE_UI、TYPE_QRC),则将其作为该类型的文件进行处理。 |
| depends | 指定输出文件的依赖关系。 |
| input | 指定应由自定义编译器处理的文件的变量。 |
| name | 对自定义编译器功能的描述。此项仅在某些后端中使用。 |
| output | 由自定义编译器生成的文件名。 |
| output_function | 指定一个用于确定要创建的文件名的自定义 qmake 函数。 |
| variables | 表示当在 pro 文件中以 $(VARNAME) 的形式引用此处指定的变量时,该变量将被替换为 $(QMAKE_COMP_VARNAME)。 |
| variable_out | 应将从输出生成的文件添加到该变量中。 |
CONFIG 成员支持以下选项:
| 选项 | 描述 |
|---|---|
| combine | 表示将所有输入文件合并为一个输出文件。 |
| target_predeps | 表示应将输出添加到PRE_TARGETDEPS 列表中。 |
| explicit_dependencies | 输出的依赖关系仅由 depends 成员生成,不会从其他任何地方获取。 |
| dep_existing_only | 将检查每个由 .depend_command 生成的依赖项是否存在。不存在的依赖项将被忽略。该值自 Qt 5.13.2 起引入。 |
| dep_lines | 将 .depend_command 的输出解释为每行一个文件。默认行为按空白符拆分,此选项仅出于向后兼容性考虑而保留。 |
| no_link | 表示不应将输出添加到待链接对象列表中。 |
库依赖
通常在链接库时,qmake 会依赖底层平台来识别该库所链接的其他库,并让平台自动引入它们。但在许多情况下,这还不够。例如,在静态链接库时,不会链接到其他库,因此也不会创建对这些库的依赖关系。 然而,后续链接到该库的应用程序需要知道如何找到静态库所需的符号。如果你显式启用了跟踪功能,qmake 会在适当的情况下尝试跟踪该库的依赖关系。
第一步是在库本身中启用依赖关系追踪。为此,您必须告诉 qmake 保存有关该库的信息:
CONFIG += create_prl这仅适用于 `lib ` 模板,对于其他模板将被忽略。启用此选项后,qmake 将创建一个以 `.prl` 结尾的文件,用于保存该库的一些元信息。该元文件类似于普通的项目文件,但仅包含内部变量声明。 在安装该库时,通过在INSTALLS声明中将其指定为目标,qmake 会自动将 .prl 文件复制到安装路径中。
此过程的第二步是启用在使用该静态库的应用程序中读取这些元信息的功能:
CONFIG += link_prl启用此功能后,qmake 将处理应用程序链接的所有库,并查找其元信息。qmake 将利用这些信息确定相关的链接信息,具体而言,会将相关值添加到应用程序项目文件的DEFINES和LIBS 列表中。 qmake 处理完该文件后,将遍历 `LIBS ` 变量中新增的库,并查找其依赖的 `.prl` 文件,直至所有库均被解析完毕。此时,将按常规流程生成 Makefile,并将库显式链接到应用程序中。
.prl 文件应仅由 qmake 生成,且不应在不同操作系统之间转移,因为它们可能包含与平台相关的信息。
© 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.