默认情况下,每个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的帮助文件。
觉得有用的话,希望大家多多关注评论转发,谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。