创建项目文件
项目文件包含了 qmake 编译应用程序、库或插件所需的全部信息。一般来说,你会使用一系列声明来指定项目中的资源,但对简单编程结构的支持能让你为不同的平台和环境描述不同的编译过程。
项目文件元素
qmake 使用的项目文件格式既可用于支持简单的联编系统,也可用于支持相当复杂的联编系统。简单的项目文件使用直接的声明式风格,定义标准变量来表示项目中使用的源文件和头文件。复杂的项目可能会使用控制流结构来微调编译过程。
下文将介绍项目文件中使用的不同类型元素。
变量
在项目文件中,变量用于保存字符串列表。在最简单的项目中,这些变量通知 qmake 要使用的配置选项,或提供编译过程中要用到的文件名和路径。
qmake 会在每个项目文件中查找特定的变量,并使用这些变量的内容来决定应该写入 Makefile 的内容。例如,HEADERS和SOURCES变量中的值列表用于告诉 qmake 与项目文件在同一目录下的头文件和源文件。
变量还可以在内部用来存储临时的值列表,现有的值列表也可以用新的值覆盖或扩展。
下面的代码段说明了如何将值列表分配给变量:
HEADERS = mainwindow.h paintwidget.h
变量中的值列表按以下方式扩展:
SOURCES = main.cpp mainwindow.cpp \ paintwidget.cpp CONFIG += console
注意: 第一次赋值只包括与HEADERS
变量在同一行中指定的值。第二个赋值通过使用反斜线 (\),将SOURCES
变量中的值分割成不同行。
CONFIG变量是 qmake 在生成 Makefile 时使用的另一个特殊变量。它将在常规配置 中讨论。在上面的代码段中,console
被添加到CONFIG
中的现有值列表中。
下表列出了一些常用变量及其内容。有关变量及其说明的完整列表,请参阅变量。
变量 | 内容 |
---|---|
CONFIG | 常规项目配置选项。 |
DESTDIR | 存放可执行文件或二进制文件的目录。 |
格式 | 用户界面编译器(uic)要处理的用户界面文件列表。 |
头文件 | 构建项目时使用的头文件(.h)的文件名列表。 |
QT | 项目中使用的 Qt 模块列表。 |
资源 | 包含在最终项目中的资源(.qrc)文件列表。有关这些文件的更多信息,请参阅 "Qt 资源系统"。 |
源代码 | 构建项目时使用的源代码文件列表。 |
模板 | 项目要使用的模板。这决定了构建过程的输出是应用程序、库还是插件。 |
通过在变量名前加上$$
,可以读取变量的内容。这可用于将一个变量的内容赋值给另一个变量:
TEMP_SOURCES = $$SOURCES
$$
运算符广泛用于对字符串和值列表进行操作的内置函数。更多信息,请参阅qmake 语言。
空白
通常,空格分隔变量赋值中的值。要指定包含空格的值,必须用双引号括起来:
DEST = "Program Files"
在变量的值列表中,引号文本被视为一个单独的项目。类似的方法也用于处理包含空格的路径,特别是在为 Windows 平台定义INCLUDEPATH和LIBS变量时:
win32:INCLUDEPATH += "C:/mylibs/extra headers" unix:INCLUDEPATH += "/home/user/extra headers"
注释
您可以在项目文件中添加注释。注释以#
字符开始,一直延续到同一行的末尾。例如
# Comments usually start at the beginning of a line, but they # can also follow other content on the same line.
要在变量赋值中包含#
字符,必须使用内置LITERAL_HASH变量的内容。
内置函数和控制流
qmake 提供了许多内置函数来处理变量的内容。在简单的项目文件中最常用的函数是include(),它以文件名为参数。给定文件的内容将包含在项目文件中使用include
函数的位置。include
函数最常用于包含其他项目文件:
include(other.pro)
对条件结构的支持通过作用域实现,其行为类似于编程语言中的if
语句:
win32 { SOURCES += paintwidget_win.cpp }
大括号内的赋值只有在条件为真的情况下才会进行。在这种情况下,必须设置win32
CONFIG选项。这在 Windows 系统中会自动执行。开头大括号必须与条件位于同一行。
内置函数(如find()、unique( ) 和count ())可以对变量进行更复杂的操作,这些操作通常需要循环。这些函数和许多其他函数用于操作字符串和路径、支持用户输入和调用外部工具。有关使用函数的更多信息,请参阅qmake 语言。有关所有函数及其说明的列表,请参阅替换函数和测试函数。
项目模板
TEMPLATE变量用于定义将要构建的项目类型。如果在项目文件中没有声明,qmake 会假定应该联编一个应用程序,并为此生成一个适当的 Makefile(或等效文件)。
下表总结了可用的项目类型,并描述了 qmake 将为每种类型生成的文件:
模板 | qmake 输出 |
---|---|
应用程序(默认) | 用于构建应用程序的 Makefile。 |
lib | 用于编译库的 Makefile。 |
aux | 不联编任何内容的 Makefile。如果不需要调用编译器来创建目标,例如您的项目是用解释型语言编写的,请使用此模板。 注意: 此模板类型仅适用于基于 Makefile 的生成器。尤其是 vcxproj 和 Xcode 生成器。 |
子目录 | 包含使用SUBDIRS变量指定的子目录规则的 Makefile。每个子目录必须包含自己的项目文件。 |
vcapp | 用于构建应用程序的 Visual Studio 项目文件。 |
vclib | 用于构建库的 Visual Studio 项目文件。 |
vcsubdirs | Visual Studio 解决方案文件,用于在子目录中构建项目。 |
有关为使用app
和lib
模板的项目编写项目文件的建议,请参阅构建常见项目类型。
使用subdirs
模板时,qmake 会生成一个 Makefile 来检查每个指定的子目录,处理在其中找到的任何项目文件,并在新创建的 Makefile 上运行平台的make
工具。SUBDIRS
变量用于包含要处理的所有子目录的列表。
常规配置
CONFIG变量指定了项目应配置的选项和功能。
项目可以在release模式或调试模式下构建,也可以在这两种模式下构建。如果同时指定调试模式和发布模式,则最后一种模式生效。如果指定debug_and_release
选项来同时编译项目的调试版和发行版,qmake 生成的 Makefile 会包含一条同时编译两个版本的规则。调用方法如下:
make all
在CONFIG
变量中添加build_all
选项,使该规则成为编译项目时的默认规则。
注意: 在CONFIG
变量中指定的每个选项也可用作作用域条件。您可以使用内置的CONFIG()函数来测试某些配置选项是否存在。例如,下面几行显示了作为作用域条件的函数,用于测试是否只使用了opengl
选项:
CONFIG(opengl) { message(Building with OpenGL support.) } else { message(OpenGL support is not available.) }
这样就可以为release
和debug
版本定义不同的配置。有关更多信息,请参阅使用作用域。
以下选项定义了要构建的项目类型。
注意: 其中一些选项只有在相关平台上使用时才会生效。
选项 | 说明 |
---|---|
qt | 项目是 Qt 应用程序,应与 Qt 库链接。您可以使用QT 变量来控制应用程序所需的任何其他 Qt 模块。该值默认为已添加,但如果要在非 Qt 项目中使用 qmake,则可以删除该值。 |
x11 | 项目是 X11 应用程序或库。如果目标使用 Qt,则不需要此值。 |
应用程序和库项目模板为你提供了更多专门的配置选项,以微调编译过程。这些选项在"构建常见项目类型"中有详细说明。
例如,如果您的应用程序使用 Qt XML 库,并希望以debug
模式构建,您的项目文件将包含以下一行:
CONFIG += qt debug
注意: 必须使用 "+=",而不是"=",否则 qmake 将无法使用 Qt 的配置来确定项目所需的设置。
声明 Qt 库
如果CONFIG变量包含qt
值,qmake 对 Qt 应用程序的支持就会启用。这样就可以对应用程序使用的 Qt 模块进行微调。QT变量可用于声明所需的扩展模块。例如,我们可以按以下方式启用 XML 和网络模块:
QT += network xml
注意: QT
默认包含core
和gui
模块,因此上述声明在默认列表中添加了网络和 XML 模块。下面的赋值省略了默认模块,在编译应用程序源代码时会导致错误:
QT = network xml # This will omit the core and gui modules.
如果要编译不包含 gui
模块的项目,则需要使用运算符"-="将其排除在外。默认情况下,QT
包含core
和gui
,因此下面一行将导致构建一个最小的 Qt 项目:
QT -= gui # Only the core module is used.
有关可添加到QT
变量的 Qt 模块列表,请参阅QT。
配置功能
qmake 可以设置额外的配置功能,这些功能在 feature (.prf) 文件中指定。这些额外的功能通常支持在联编过程中使用的自定义工具。要在编译过程中添加特性,请将特性名(特性文件名的后缀)追加到CONFIG
变量。
例如,qmake 可以用以下几行配置联编过程,以利用pkg-config 支持的外部库,如 D-Bus 和 oggr 库:
CONFIG += link_pkgconfig PKGCONFIG += ogg dbus-1
有关添加功能的更多信息,请参阅添加新配置功能。
声明其他库
如果你要在项目中使用 Qt 提供的库之外的其他库,你需要在项目文件中指定它们。
qmake 搜索库的路径和要链接的特定库可以添加到LIBS变量的值列表中。你可以指定库的路径,或使用 Unix 风格的符号来指定库和路径。
例如,下面几行显示了如何指定一个库:
LIBS += -L/usr/local/lib -lmath
也可以使用INCLUDEPATH变量以类似方式指定包含头文件的路径。
例如,添加多个路径以搜索头文件:
INCLUDEPATH = c:/msdev/include d:/stl/include
© 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.