三、qmake创建项目文件
项目文件(.pro)包含qmake构建应用程序、库或插件所需的所有信息。通常,您会使用一系列声明来指定项目中的资源,但简单的编程结构支持也使您能够描述不同平台和环境的不同构建过程。
1 项目文件元素
qmake使用的项目文件格式既可支持简单又可支持相当复杂的构建系统。简单的项目文件采用直接的声明式风格,定义标准变量来指示项目中使用的源文件和头文件。复杂的项目可能使用控制流结构来微调构建过程。
以下部分描述了项目文件中使用的不同类型的元素。
1.1 变量
在项目文件中,变量用于存储字符串列表。在最简单的项目中,这些变量告知qmake使用哪些配置选项,或提供构建过程中使用的文件名和路径。
qmake在每个项目文件中查找特定变量,并根据这些变量的内容决定应该写入Makefile的内容。例如,HEADERS和SOURCES变量中的值列表用来告知qmake项目文件同一目录下的头文件和源文件。
变量也可以内部用于存储临时值列表,现有的值列表可以被覆盖或用新值扩展。
以下代码段展示了如何将值列表分配给变量:
HEADERS = mainwindow.h paintwidget.h
在项目文件中,变量中的值列表通过以下方式扩展:
SOURCES = main.cpp mainwindow.cpp \
paintwidget.cpp
CONFIG += console
注意:第一个赋值只包括与HEADERS变量同行指定的值。第二个赋值使用反斜杠(\)将SOURCES变量中的值分散在多行。
CONFIG
变量是qmake在生成Makefile时使用的另一个特殊变量,在“General Configuration”中有讨论。在上面的代码片段中,console被添加到CONFIG中已有值的列表中。
以下表格列出了一些常用变量及其内容。有关变量及其描述的完整列表,请参见“变量”。
可以通过在变量名前加上$$来读取变量的内容。这可以用来将一个变量的内容分配给另一个变量:
变量 | 内容 |
---|---|
CONFIG | 项目的一般配置选项。 |
DESTDIR | 可执行文件或二进制文件将被放置的目录。 |
FORMS | 用户界面编译器(uic)将处理的UI文件列表。 |
HEADERS | 构建项目时使用的头文件(.h文件)的文件名列表。 |
QT | 项目中使用的Qt模块列表。 |
RESOURCES | 最终项目中包含的资源(.qrc)文件列表。 |
SOURCES | 构建项目时使用的源代码文件列表。 |
TEMPLATE | 项目的模板。这决定了构建过程的输出类型。 |
TEMP_SOURCES = $$SOURCES
$$
操作符被广泛用于内置函数,这些函数对字符串和值列表进行操作。
空白字符
通常,空白字符用于分隔变量赋值中的值。如果要使用空格,必须添加双引号。
DEST = "Program Files"
带引号的文本将被视为变量所持有的值列表中的单个项。在定义 Windows 平台的 INCLUDEPATH 和 LIBS 变量时,尤其包含空格的路径也采用类似的方法:
win32:INCLUDEPATH += “C:/mylibs/extra headers” unix:INCLUDEPATH += “/home/user/extra headers”
1.2 注释
您可以向项目文件添加注释。注释以 # 字符开头,并延续到同一行的末尾。例如:
# 注释通常从行的开头开始,但也可以跟随同一行上的其他内容。
要在变量赋值中包含 # 字符,必须使用内置的 LITERAL_HASH 变量的内容。
1.3 内置函数和控制流
qmake 提供了许多内置函数,以便处理变量的内容。在简单的项目文件中最常使用的函数是 include() 函数,它以文件名作为参数。给定文件的内容将包含在项目文件中,包含函数所用的位置。include 函数最常用于包含其他项目文件:
include(other.pro)
通过类似于编程语言中的 if 语句的作用域来提供对条件结构的支持:
win32 {
SOURCES += paintwidget_win.cpp
}
花括号内的赋值只有在条件为真时才会执行。在这种情况下,win32 配置选项必须已设置。这在 Windows 上会自动发生。打开花括号必须与条件位于同一行。 对变量进行更复杂的操作通常需要循环的内置函数,例如 find()、unique() 和 count()。这些函数以及许多其他函数用于操作字符串和路径、支持用户输入以及调用外部工具。有关使用这些函数的更多信息,请参阅 qmake 语言。有关所有函数及其描述的列表,请参阅替代函数和测试函数。
2 项目模板
TEMPLATE 变量用于定义将要构建的项目类型。如果在项目文件中未声明此变量,qmake 将假定应构建一个应用程序,并生成一个适当的 Makefile(或等效文件)。
以下表格总结了可用的项目类型,并描述了 qmake 会为每个项目生成的文件:
模板 | qmake 输出 |
---|---|
app(默认) | 用于构建应用程序的Makefile。 |
lib | Makefile用于构建库。 |
aux | Makefile用于构建空项目。如果不需要调用编译器来创建目标,例如因为您的项目是用解释性语言编写的,则使用此选项。注意:此模板类型仅适用于基于Makefile的生成器。特别是,它不适用于vcxproj和Xcode生成器。 |
subdirs | 包含使用SUBDIRS变量指定的子目录的规则的Makefile。每个子目录必须包含自己的项目文件。 |
vcapp | 用于构建应用程序的Visual Studio项目文件。 |
vclib | 用于构建库的Visual Studio项目文件。 |
vcsubdirs | 用于构建子目录中的项目的Visual Studio解决方案文件。 |
有关编写使用app和lib模板的项目文件的建议,请参阅构建常见项目类型。
当使用subdirs模板时,qmake会生成一个Makefile来检查每个指定的子目录,处理它们找到的任何项目文件,并在新创建的Makefile上运行平台的make工具。SUBDIRS变量用于包含要处理的所有子目录的列表。
3 常规配置
CONFIG变量指定应配置项目的选项和功能。
项目可以在发布模式或调试模式下构建,也可以同时构建两者。如果同时指定了debug和release,则最后一个生效。如果指定了debug_and_release选项以构建项目的调试和发布版本,qmake生成的Makefile中包含一个构建两个版本的规则。可以按以下方式调用它:
make all
将build_all选项添加到CONFIG变量中,使此规则在构建项目时成为默认规则。
注意:
CONFIG变量中指定的每个选项也可以用作作用域条件。您可以使用内置的CONFIG()函数来测试某些配置选项是否存在。例如,以下行显示了该函数作为条件的作用域,以测试是否仅使用了opengl选项:
CONFIG(opengl) {
message(Building with OpenGL support.)
} else {
message(OpenGL support is not available.)
}
这使得可以为发布版本和调试版本定义不同的配置。有关更多信息,请参阅使用作用域。
以下选项定义要构建的项目类型。
注意:某些选项仅在相关平台上使用时才会生效。
例如,如果您的应用程序使用Qt库并且要在调试模式下构建,您的项目文件将包含以下行:
CONFIG += qt debug
注意:必须使用”+=”,而不是”=”,否则qmake将无法使用Qt的配置来确定项目所需的设置。
4 声明Qt库
如果CONFIG变量包含qt值,qmake将启用对Qt应用程序的支持。这使得可以微调应用程序使用的Qt模块。可以使用QT变量来声明所需的扩展模块。例如,我们可以以下面的方式启用XML和network模块:
QT += network xml
注意:QT默认包含核心和gui模块,因此上述声明将这些默认模块添加到列表中。以下赋值省略了默认模块,并且在编译应用程序的源代码时将导致错误:
QT = network xml # 这将省略核心和gui模块。
如果要构建不包含gui模块的项目,您需要使用”-=”运算符将其排除。默认情况下,QT包含core和gui,因此以下行将导致构建一个最小的Qt项目:
QT -= gui # 只使用核心模块。
有关可以添加到QT变量的Qt模块列表,请参阅QT。
5 配置功能
qmake可以设置额外的配置功能,这些功能在特性(.prf)文件中指定。这些额外功能通常提供对构建过程中使用的自定义工具的支持。要将功能添加到构建过程中,请将功能名称(特性文件名的前缀)附加到CONFIG变量。
例如,qmake可以配置构建过程以利用由pkg-config支持的外部库,例如D-Bus和ogg库,如下所示:
CONFIG += link_pkgconfig
PKGCONFIG += ogg dbus-1
有关添加功能的更多信息,请参阅添加新的配置功能。
6 声明其他库
如果您的项目除了Qt提供的库外还使用其他库,您需要在项目文件中指定它们。
qmake搜索库的路径和要链接的特定库可以添加到LIBS变量中的值列表中。您可以指定库的路径,或使用指定库和路径的Unix样式表示法。
例如,以下行显示了如何指定库:
LIBS += -L/usr/local/lib -lmath
包含头文件的路径也可以以类似的方式指定,使用INCLUDEPATH变量。
例如,要添加用于搜索头文件的多个路径:
INCLUDEPATH = c:/msdev/include d:/stl/include
7 参考
Creating Project Files:https://doc.qt.io/qt-6/qmake-project-files.html#project-templates