第3章 创建项目文件
项目文件包含qmake构建应用程序、库或插件所需的所有信息。通常,您可以使用一系列声明来指定项目中的资源,但简单的编程构造使您能够描述针对不同平台/环境的不同构建过程。
项目文件元素
QMake所使用的项目文件格式可用于支持简单和相当复杂的构建系统。简单的项目文件使用直接的声明式样式,定义标准变量来指示项目中使用的源文件和头文件。复杂的项目可以使用控制流结构来微调构建过程。
以下部分描述了在项目文件中使用的不同类型的元素。
变量
在项目文件中,变量用于保存字符串的列表。在最简单的项目中,这些变量通知qmake关于要使用的配置选项,或者提供要在构建过程中使用的文件名和路径。
QMake在每个项目文件中查找某些变量,并使用这些内容来确定应该写入Makefile的内容。例如,HEADERS
和SOURCE
变量中的值列表用于告诉qmake关于与项目文件在同一目录中的头文件和源文件。
变量还可以在内部,用于存储临时的值列表,并且现有的值列表可以用新的值进行覆盖或扩展。
下面的代码片段说明了如何将值分配给变量:
变量中的值列表将以以下方式进行扩展:
注:第一个分配仅包括与HEADERS
变量在同一行上指定的值。第二个分配通过使用反斜杠(\)跨行分割SOURCES变量中的值。
CONFIG
变量是qmake在生成Makefile时使用的另一个特殊变量。它在通用配置中进行了讨论。在上面的代码片段中,console
被添加到配置中包含的现有值的列表中。
下表列出了一些常用的变量,并描述了它们的内容。有关变量及其描述的完整列表,请参见变量。
CONFIG
通用项目配置项。
DESTDIR
可执行文件或二进制文件所在的目录。
FORMS
需要由user interface compiler(uic)处理的UI文件的列表。
HEADERS
构建项目时使用的头(.h)文件的文件名列表。
QT
在项目中使用的Qt模块的列表。
RESOURCES
SOURCES
构建项目时使用的源代码文件列表。
TEMPLATE
要用于该项目的模板。这决定了构建过程的输出是应用程序、库还是插件。
一个变量的内容可以通过该变量名前附加$$
来读取。这可以用来将一个变量的内容分配给另一个变量:
$$
操作符广泛用于对字符串和值列表进行操作的内置函数。有关更多信息,请参见qmake语言。
空格(Whitespace)
通常,空格会在变量分配中分隔值。要指定包含空格的值,必须用双引号将这些值括起来:
引号的文本被视为变量持有的值列表中的单个项。类似的方法也用于处理包含空格的路径,特别是在为Windows平台定义包含INCLUDEPATH
和LIBS
变量时:
注释
您可以向项目文件中添加注释。注释以#
字符开始,并继续到同一行的末尾。例如:
要在变量赋值中包含#
字符,必须使用内置的LITERAL_HASH
变量的内容。
内置功能和控制流程
qmake提供了许多内置函数来处理变量的内容。在简单的项目文件中,最常用的函数是include()
函数,它将一个文件名作为一个参数。给定文件的内容将会包含在项目文件中使用include()
函数的位置。include()
函数最常用于包含其他项目文件:
对条件结构的支持通过编程语言中的scopes
提供,它的行为类似于编程语言中的if
语句:
只有当条件为真时,才会进行大括号内的分配。在这种情况下,必须设置包含win32
的CONFIG
选项。这将在Windows上自动发生。左大括号必须与条件语句写在同一行。
对于通常需要循环的变量,更复杂的操作由内置函数提供,如find()
、unique()
和count()
。提供了这些函数和许多其他函数来操作字符串和路径、支持用户输入和调用外部工具。有关使用这些函数的更多信息,请参见qmake语言。有关所有函数及其描述的列表,请参见替换函数和测试函数。
项目模板
TEMPLATE
变量用于定义要构建的项目的类型。如果没有在项目文件中声明,qmake假设应该构建的是一个应用程序,并将为此生成适当的Makefile(或等效文件)。
下表总结了可用的项目类型,并描述了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将包含一个同时构建这两个版本的规则。这可以通过以下方式进行调用:
向CONFIG
变量中添加build_all
选项会使此规则成为构建项目时的默认规则。
注:在CONFIG变量中指定的每个选项也可以用作作用域的条件。您可以通过使用内置的CONFIG()函数来测试某些配置选项的存在。例如,下面的代码行展示了将函数作为条件,以测试是否只使用opengl选项:
这就允许了为release
和debug
构建定义不同的配置。有关详细信息,请参见使用作用域。
以下选项定义了要构建的项目的类型。
注:其中一些选项只有在相关平台上使用时才会生效。
qt
该项目是一个Qt应用程序,应该与Qt库进行链接。您可以使用QT变量来控制应用程序所需的任何其他QT模块。默认情况下会添加此值,但您可以删除它以对非qt项目使用qmake。
x11
该项目是一个X11应用程序或库。如果目标使用Qt,则不需要此值。
应用程序和库项目模板为您提供了更专门的配置选项,以微调构建过程。这些选项在构建公共项目类型中都有详细的说明。
例如,如果您的应用程序使用Qt库,并且您希望在调试模式下构建它,那么您的项目文件将包含以下几行:
注:您必须使用“+=”,而不是“=”,否则qmake将无法使用Qt的配置来确定项目所需的设置。
声明Qt库
如果CONFIG
变量包含qt值,则会启用qmake对Qt应用程序的支持。这使得微调应用程序使用的哪些Qt模块成为可能。这是通过QT
变量来实现的,该变量可用于声明所需的扩展模块。例如,我们可以通过以下方式启用xml
和network
模块:
注:默认情况下,QT包括core和gui模块,所以,上面的声明将network模块和xml模块添加到这个默认列表中。以下赋值省略了默认模块,并将在编译应用程序的源代码时导致错误:
如果您想构建一个没有gui模块的项目,那么您需要使用“-=
”操作符来排除它。默认情况下,QT同时包含core
和gui
,所以下面这一行将导致构建一个最小的QT项目:
有关可以添加到QT
变量中的Qt模块的列表,请参见QT。
配置特性
可以使用定义在特性(.prf)
文件中的特性对qmake进行额外的配置。这些额外的特性通常为在构建过程中使用的自定义工具提供支持。若要向构建过程中添加特性,请将特性名称(特性文件名的词干)附加到CONFIG变量中。
例如,qmake可以配置构建过程,以利用pkg-config支持的外部库,如D-Bus和ogg库,包括以下几行:
有关添加功能的详细信息,请参见添加新的特性。
声明其他库
如果除了使用Qt提供的库之外,还在项目中使用其他库,则需要在项目文件中指定它们。
qmake搜索库的路径和要链接的特定库可以添加到LIBS变量中的值列表中。您可以指定到库的路径,或者使用unix样式的符号来指定库和路径。
例如,下面的代码显示了如何指定库:
包含头文件的路径也可以使用类似的方式使用INCLUDEPATH
变量来指定。
例如,要添加多个要搜索头文件的路径:
最后更新于