第3章 创建项目文件

项目文件包含qmake构建应用程序、库或插件所需的所有信息。通常,您可以使用一系列声明来指定项目中的资源,但简单的编程构造使您能够描述针对不同平台/环境的不同构建过程。

项目文件元素

QMake所使用的项目文件格式可用于支持简单和相当复杂的构建系统。简单的项目文件使用直接的声明式样式,定义标准变量来指示项目中使用的源文件和头文件。复杂的项目可以使用控制流结构来微调构建过程。

以下部分描述了在项目文件中使用的不同类型的元素。

变量

在项目文件中,变量用于保存字符串的列表。在最简单的项目中,这些变量通知qmake关于要使用的配置选项,或者提供要在构建过程中使用的文件名和路径。

QMake在每个项目文件中查找某些变量,并使用这些内容来确定应该写入Makefile的内容。例如,HEADERSSOURCE变量中的值列表用于告诉qmake关于与项目文件在同一目录中的头文件和源文件。

变量还可以在内部,用于存储临时的值列表,并且现有的值列表可以用新的值进行覆盖或扩展。

下面的代码片段说明了如何将值分配给变量:

HEADERS = mainwindow.h  paintwidget.h

变量中的值列表将以以下方式进行扩展:

SOURCES = main.cpp mainwindow.cpp \
          paintwidget.cpp
CONFIG += console

注:第一个分配仅包括与HEADERS变量在同一行上指定的值。第二个分配通过使用反斜杠(\)跨行分割SOURCES变量中的值。

CONFIG变量是qmake在生成Makefile时使用的另一个特殊变量。它在通用配置中进行了讨论。在上面的代码片段中,console被添加到配置中包含的现有值的列表中。

下表列出了一些常用的变量,并描述了它们的内容。有关变量及其描述的完整列表,请参见变量

变量
内容

CONFIG

通用项目配置项。

DESTDIR

可执行文件或二进制文件所在的目录。

FORMS

需要由user interface compiler(uic)处理的UI文件的列表。

HEADERS

构建项目时使用的头(.h)文件的文件名列表。

QT

在项目中使用的Qt模块的列表。

RESOURCES

要包含在最终项目中的资源(.qrc)文件的列表。有关这些文件的更多信息,请参见The Qt Resource System

SOURCES

构建项目时使用的源代码文件列表。

TEMPLATE

要用于该项目的模板。这决定了构建过程的输出是应用程序、库还是插件。

一个变量的内容可以通过该变量名前附加$$来读取。这可以用来将一个变量的内容分配给另一个变量:

$$操作符广泛用于对字符串和值列表进行操作的内置函数。有关更多信息,请参见qmake语言

空格(Whitespace)

通常,空格会在变量分配中分隔值。要指定包含空格的值,必须用双引号将这些值括起来:

引号的文本被视为变量持有的值列表中的单个项。类似的方法也用于处理包含空格的路径,特别是在为Windows平台定义包含INCLUDEPATHLIBS变量时:

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()函数最常用于包含其他项目文件:

对条件结构的支持通过编程语言中的scopes提供,它的行为类似于编程语言中的if语句:

win32 {
    SOURCES += paintwidget_win.cpp
}

只有当条件为真时,才会进行大括号内的分配。在这种情况下,必须设置包含win32CONFIG选项。这将在Windows上自动发生。左大括号必须与条件语句写在同一行。

对于通常需要循环的变量,更复杂的操作由内置函数提供,如find()unique()count()。提供了这些函数和许多其他函数来操作字符串和路径、支持用户输入和调用外部工具。有关使用这些函数的更多信息,请参见qmake语言。有关所有函数及其描述的列表,请参见替换函数测试函数

项目模板

TEMPLATE变量用于定义要构建的项目的类型。如果没有在项目文件中声明,qmake假设应该构建的是一个应用程序,并将为此生成适当的Makefile(或等效文件)。

下表总结了可用的项目类型,并描述了qmake将为每个项目生成的文件:

模板
qmake输出

app(默认)

创建一个应用程序的Makefile。

lib

创建一个库的Makefile。

aux

不会创建任何东西的Makefile。如果不需要调用编译器来创建目标,则可以使用此方法,例如,您的项目是用解释型语言编写的。

注:此模板类型仅适用于基于makefile的生成器。特别是,它不能使用vcxproj和Xcode生成器。

subdirs

包含使用SUBDIR变量指定的子目录规则的生成文件。每个子目录都必须包含其自己的项目文件。

vcapp

构建一个应用程序的VisualStudio项目文件。

vclib

构建一个库的VisualStudio项目文件。

vcsubdirs

VisualStudia解决方案文件,以在子目录中构建项目。

有关为使用app和lib模板的项目编写项目文件的建议,请参见构建通用项目类型

当使用subdir模板时,qmake生成一个Makefile来检查每个指定的子目录,处理它在那里找到的任何项目文件,并在新创建的Makefile上运行平台的make工具。SUBDIRS变量用于包含要处理的所有子目录的列表。

通用配置

CONFIG变量指定了项目应该使用配置的选项和特性。

该项目可以在release模式或debug模式下构建,或者两者都可以同时构建。如果同时指定了两者,则后一项将生效。如果您指定了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.)
}

这就允许了为releasedebug构建定义不同的配置。有关详细信息,请参见使用作用域

以下选项定义了要构建的项目的类型。

注:其中一些选项只有在相关平台上使用时才会生效。

选项
描述

qt

该项目是一个Qt应用程序,应该与Qt库进行链接。您可以使用QT变量来控制应用程序所需的任何其他QT模块。默认情况下会添加此值,但您可以删除它以对非qt项目使用qmake。

x11

该项目是一个X11应用程序或库。如果目标使用Qt,则不需要此值。

应用程序和库项目模板为您提供了更专门的配置选项,以微调构建过程。这些选项在构建公共项目类型中都有详细的说明。

例如,如果您的应用程序使用Qt库,并且您希望在调试模式下构建它,那么您的项目文件将包含以下几行:

CONFIG += qt debug

注:您必须使用“+=”,而不是“=”,否则qmake将无法使用Qt的配置来确定项目所需的设置。

声明Qt库

如果CONFIG变量包含qt值,则会启用qmake对Qt应用程序的支持。这使得微调应用程序使用的哪些Qt模块成为可能。这是通过QT变量来实现的,该变量可用于声明所需的扩展模块。例如,我们可以通过以下方式启用xmlnetwork模块:

QT += network xml

注:默认情况下,QT包括core和gui模块,所以,上面的声明将network模块和xml模块添加到这个默认列表中。以下赋值省略了默认模块,并将在编译应用程序的源代码时导致错误:

QT = network xml  #这将会忽略了core和gui模块

如果您想构建一个没有gui模块的项目,那么您需要使用“-=”操作符来排除它。默认情况下,QT同时包含coregui,所以下面这一行将导致构建一个最小的QT项目:

QT -= gui     #只使用了核心模块

有关可以添加到QT变量中的Qt模块的列表,请参见QT

配置特性

可以使用定义在特性(.prf)文件中的特性对qmake进行额外的配置。这些额外的特性通常为在构建过程中使用的自定义工具提供支持。若要向构建过程中添加特性,请将特性名称(特性文件名的词干)附加到CONFIG变量中。

例如,qmake可以配置构建过程,以利用pkg-config支持的外部库,如D-Bus和ogg库,包括以下几行:

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

最后更新于