qt项目在哪里写程序 从零开始学Qt-13
默认情况下,每个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.h
SOURCES = 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的帮助文件。
觉得有用的话,希望大家多多关注评论转发[赞],谢谢!
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com