从零开始学Qt – 13:一文读懂Qt项目管理文件

从零开始学Qt - 13:一文读懂Qt项目管理文件

默认情况下,每个Qt项目都包含一个后缀名为.pro、名称和项目名相同的文件,我们通常称它为项目管理文件或者工程管理文件(简称项目文件)。

项目文件包含由qmake构建应用程序、库或插件所需的所有信息。对于复杂的项目,一个项目中可能包含上百个源文件,Qt编译这些源文件的方法是:先由qmake工具根据pro文件记录的配置信息生成相应的makefile文件,然后执行make命令完成对整个项目的编译。也就是说,pro文件存储的配置信息是用来告知编译器如何编译当前项目的,所以一个Qt项目要想完美运行,既要保证各个源文件中程序的正确性,还要保证项目文件中配置信息的合理性。

对于一个刚刚创建好的Qt项目,pro文件并不是空的,而是包含一些基本的配置信息。实际开发中,Qt会自动修改pro文件的内容,但有时也需要我们手动修改,例如程序中用到某个第三方库时,就需要我们手动修改pro文件。

本文为大家详细地讲解pro文件中各个配置信息的含义,以便于在需要时手动修改pro文件。

一、项目文件的要素

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

(1)变量

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

qmake在每个项目文件中查找这些变量,并使用这些内容来确定应该写入Makefile的内容。例如,HEADERS和SOURCES中的值表示与项目管理文件在同一目录中的头文件和源文件。

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

下面的语句说明了如何将值赋值给变量:

HEADERS = mainwindow.h paintwidget.hSOURCES = main.cpp mainwindow.cpp paintwidget.cpp

变量中的值通过以下方式进行扩展:

CONFIG = console

下表列出了一些常用的变量,并对其进行了简要描述。本文后面会对一些变量进行专门介绍。

变量

说明

CONFIG

一般项目配置选项

DESTDIR

指定生成的应用程序放置的目录

TARGET

指定目标文件名。如果不设置,目标名会被自动设置为跟项目文件一样的名称。

FORMS

用户界面编译器(uic)要处理的UI文件列表

UI_DIR

指定uic命令将.ui文件转化成ui_*.h文件的存放的目录

HEADERS

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

QT

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

RESOURCES

要包含在最终项目中的资源文件(.qrc)的列表

RCC_DIR

指定rcc命令将.qrc文件转换成qrc_*.h文件的存放目录

SOURCES

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

TEMPLATE

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

INCLUDEPATH

头文件包含路径

OBJECTS_DIR

指定目标文件(obj)的存放目录

MOC_DIR

指定moc命令将含Q_OBJECT的头文件转换成标准.h文件的存放目录

DEPENDPATH

程序编译时依赖的相关路径

CODECFORSRC

源文件编码方式

LIBS

引入的lib文件的路径

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

TEMP_SOURCES = $$SOURCES

$$操作符被广泛地用于对字符串和值列表进行操作的内置函数。

(2)空格

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

DEST = "Program Files"

类似的方法也用于处理包含空格的路径,特别是在为Windows平台定义INCLUDEPATH路径和LIBS变量时:

win32:INCLUDEPATH = "C:/mylibs/extra headers"unix:INCLUDEPATH = "/home/user/extra headers"

(3)注释

你可以向项目文件中添加注释。注释以#字符开始,并持续到同一行的末尾。例如:

# Comments usually start at the beginning of a line, but they# can also follow other content on the same line.

要在变量赋值中包含#字符,必须使用内置的LITERAL_HASH变量的内容。

(4)内置函数和控制流程

qmake提供了许多内置函数来处理变量的内容。在简单的项目文件中,最常用的函数是include()函数,以一个文件名作为一个参数。给定文件的内容将被包含在项目文件中使用include函数的位置。include函数最常用于包含其他项目文件:

include(other.pro)

对条件语句的支持是通过类似编程语言中的if语句的范围(scopes)提供的:

win32 { SOURCES = paintwidget_win.cpp}

只有当条件为真时,才会进行大括号内的赋值操作。在上面的语句中,必须将CONFIG设置为win32,才会执行SOURCES赋值,这在Windows上是自动进行的。第一个括号{必须与条件在同一行。

对于需要进行循环操作的变量,通常使用内置函数:find()、unique()和count()等等。这些函数可以用于操作字符串和路径、支持用户输入和调用外部工具。有关使用这些函数的更多信息,请参见qmake语言。

二、项目模板(TEMPLATE变量

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

模板

qmake输出

app (缺省)

构建应用程序的Makefile

lib

构建库(library)的Makefile

aux

不构建任何东西的Makefile。如果不需要调用编译器来创建目标,则可以使用此方法。

subdirs

生成makefile文件编译subdirs指定的子文件夹

vcapp

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

vclib

建立一个库的VisualStudio项目文件

vcsubdirs

VisualStudio解决方案文件,用于在子目录中构建项目

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

三、CONFIG变量

指定项目配置和编译器选项。这些值可以被qmake在内部识别,部分选项的说明如下。

标识名称

说明

release

应用程序将以release模式生成。如果“debug”被指定,它将被忽略

debug

应用程序将以debug模式生成

warn_on

编译器会输出尽可能多的警告信息。如果“warn_off”被指定,它将被忽略。

warn_off

编译器会输出尽可能少的警告信息。

qt

应用程序是一个Qt应用程序,并且Qt库将会被链接。

thread

应用程序是一个多线程的应用程序

windows

只用于“app”模板:应用程序是一个Windows下的窗口应用程序

console

只用于“app”模板:应用程序是一个Windows下的控制台应用程序

dll

只用于“lib”模板:库是一个共享库(dll)

staticlib

只用于“lib”模板:库是一个静态库

plugin

只用于“lib”模板:库是一个插件,这将会使dll选项生效

四、声明Qt库(QT变量)

通过QT变量,可以声明所需的扩展模块。例如,我们可以通过以下方式启用XML和网络模块:

QT = network xml

注意:默认情况下,QT包括core和gui模块,所以上面的声明将network和XML模块添加到这个默认列表中。以下赋值省略了默认模块,这将在编译程序时出现错误:

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

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

QT -= gui # 只包含了core模块

五、声明其他库

如果除了使用Qt提供的库之外,还在项目中使用其他库,则需要在项目文件中指定它们。通过LIBS变量,可以指定qmake要搜索的库和要链接的特定库的路径。例如,

LIBS = -L/usr/local/lib -lmath

包含头文件的路径也可以使用INCLUDEPATH 变量以类似的方式指定。 例如,要添加多个要搜索头文件的路径:

INCLUDEPATH = c:/msdev/include d:/stl/include

更具体的项目文件信息,可以参考Qt的帮助文件。

觉得有用的话,希望大家多多关注评论转发[赞],谢谢!

相关新闻

联系我们
联系我们
在线咨询
分享本页
返回顶部