在学习别的同学整理的开源项目的时候,有时候发现别人写的工程文件pro,看上去都很深奥,调用了很多函数和方法,而这些对于你来说却很陌生。想进阶成为优秀的QTer,能够写出优秀的工程文件来管理项目,还是很有必要的,所以今天先来学习下qmake相关的知识
qmake工具有助于简化跨不同平台的开发项目的构建过程。它可以自动生成Makefile,因此只需要几行信息即可创建每个Makefile。您可以将qmake用于任何软件项目,无论是否使用Qt编写。
qmake根据项目文件中的信息生成一个Makefile。项目文件由开发人员创建,通常很简单,但是可以为复杂项目创建更复杂的项目文件。
qmake包含其他功能来支持Qt开发,并自动包括moc和uic的构建规则。
qmake还可以为Microsoft Visual Studio生成项目,而无需开发人员更改项目文件。
qmake工具为您提供了一个面向项目的系统,用于管理应用程序,库和其他组件的构建过程。这种方法使您可以控制所使用的源文件,并可以简明地描述过程中的每个步骤,通常在单个文件中进行描述。qmake将每个项目文件中的信息扩展到一个Makefile,该文件执行用于编译和链接的必要命令。
我们来写一个简单的工程,有如下几个文件
hello.cpp
hello.h
main.cpp
Pro文件里面添加结果如下
SOURCES += main.cpp\
hello.cpp
HEADERS += hello.h
设置下项目目标名称
TARGET = helloworld
接下来可以通过qmake来生成对应的makefile文件,命令如下:
qmake -o Makefile hello.pro
对于Visual Studio用户,qmake也可以生成Visual Studio项目文件。例如:
qmake -tp vc hello.pro
应用程序的发行版不包含任何调试符号或其他调试信息。在开发过程中,产生具有相关信息的应用程序的调试版本非常有用。这是很容易实现添加debug到CONFIG项目文件变量。
CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
经过几个小时的编码,您可能已经开始了应用程序特定于平台的部分,并决定将依赖于平台的代码分开。因此,您现在有两个新文件要包含到您的项目文件中:hellowin.cpp和hellounix.cpp。我们不能仅仅将它们添加到SOURCES变量中,因为那样会将两个文件都放入Makefile中。因此,我们在这里要做的是使用一个范围,该范围将根据我们要构建的平台进行处理。
添加Windows平台相关文件的简单作用域如下所示:
win32 {
SOURCES += hellowin.cpp
}
当为Windows构建时,qmake将添加hellowin.cpp到源文件列表中。当为任何其他平台构建时,qmake只会忽略它。现在剩下要做的就是为Unix专用文件创建作用域。
完成此操作后,您的项目文件应如下所示:
CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
win32 {
SOURCES += hellowin.cpp
}
unix {
SOURCES += hellounix.cpp
}
然后像之前一样用qmake生成makefile文件
如果某个文件不存在,则可能不想创建Makefile。我们可以使用exist()函数检查文件是否存在。我们可以使用error()函数停止qmake的处理。这与作用域的工作方式相同。只需用功能替换范围条件。检查名为main.cpp的文件如下所示:
!exists( main.cpp ) {
error( "No main.cpp file found" )
}
假设您使用Windows,并且希望qDebug()在命令行上运行应用程序时能够看到语句输出。要查看输出,必须使用适当的控制台设置来构建应用程序。我们可以轻松地将console其添加CONFIG到Windows的Makefile中。但是,让我们说,我们只是要添加的CONFIG行,当我们在Windows上运行,并在debug已经是上CONFIG线。这需要使用两个嵌套的作用域。首先创建一个作用域,然后在其中创建另一个作用域。将要处理的设置放入第二个作用域,如下所示:
win32 {
debug {
CONFIG += console
}
}
可以使用冒号将嵌套范围合并在一起,因此最终项目文件如下所示:
CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
win32 {
SOURCES += hellowin.cpp
}
unix {
SOURCES += hellounix.cpp
}
!exists( main.cpp ) {
error( "No main.cpp file found" )
}
win32:debug {
CONFIG += console
}
而已!您现在已经完成了qmake的教程,并准备为开发项目编写项目文件。
项目文件包含qmake生成应用程序,库或插件所需的所有信息。通常,您使用一系列声明来指定项目中的资源,但是对简单编程结构的支持使您能够描述针对不同平台和环境的不同构建过程。
qmake使用的项目文件格式可用于支持简单和相当复杂的构建系统。简单的项目文件使用简单的声明式样式,定义标准变量以指示项目中使用的源文件和头文件。复杂的项目可能会使用控制流结构来微调构建过程。
以下各节描述了项目文件中使用的不同类型的元素:
在项目文件中,变量用于保存字符串列表。在最简单的项目中,这些变量通知qmake要使用的配置选项,或提供在构建过程中使用的文件名和路径。
qmake在每个项目文件中查找某些变量,并使用这些变量的内容来确定应将哪些内容写入Makefile。例如,HEADERS和SOURCES变量中的值列表用于告知qmake与项目文件位于同一目录中的头文件和源文件。
变量也可以在内部用于存储临时值列表,并且现有值列表可以用新值覆盖或扩展。
以下代码段说明了如何将值列表分配给变量:
HEADERS = mainwindow.h paintwidget.h
变量中的值列表以以下方式扩展:
SOURCES = main.cpp mainwindow.cpp \
paintwidget.cpp
CONFIG += console
注意:第一个赋值只包含与HEADERS变量在同一行上指定的值。第二个赋值SOURCES使用反斜杠(\)将变量中的值分成几行。
CONFIG变量是生成文件时的qmake用途另一个特殊的变量。在“ 常规配置”中进行了讨论。在上面的代码段中,console将添加到中包含的现有值列表CONFIG。
下表列出了一些常用变量并描述了它们的内容。有关变量及其说明的完整列表,请参见变量以及之前的文章Qt pro文件整理归纳
变量的内容可以通过在变量名前添加来读取$$。这可用于将一个变量的内容分配给另一个:
TEMP_SOURCES = $$ SOURCES
该$$在字符串和列表操作功能广泛使用。有关更多信息,请参见qmake语言。
通常,空格分隔变量分配中的值。要指定包含空格的值,必须将值用双引号引起来:
DEST = "Program Files"
引用的文本在变量所保存的值列表中被视为单个项目。使用类似的方法来处理包含空格的路径,尤其是在为Windows平台定义INCLUDEPATH和LIBS变量时:
win32 :INCLUDEPATH + = “ C:/ mylibs / extra headers”
unix :INCLUDEPATH + = “ / home / user / extra headers”
您可以在项目文件中添加注释。注释以#字符开头,并持续到同一行的末尾。例如:
# Comments usually start at the beginning of a line, but they
# can also follow other content on the same line.
qmake提供了许多内置函数来启用变量内容的处理。简单项目文件中最常用的函数是include()函数,该函数以文件名作为参数。给定文件的内容包含在include使用该功能的项目文件中。该include函数最常用于包含其他项目文件:
include(other.pro)
通过作用域类似于if编程语言中的语句,可以提供对条件结构的支持:
win32 {
SOURCES += paintwidget_win.cpp
}
仅当条件为真时,才进行大括号内的赋值。在这种情况下,必须设置win32 CONFIG选项。这在Windows上自动发生。开口支架必须与条件保持一致。
内置函数(例如find(),unique()和count())对通常需要循环的变量进行更复杂的操作。提供了这些功能以及许多其他功能来操纵字符串和路径,支持用户输入以及调用外部工具。有关使用功能的更多信息,请参见qmake语言。有关所有功能及其说明的列表,请参见替换功能和测试功能。
该模板变量用于定义将要建成的项目类型。如果未在项目文件中声明它,则qmake假定应构建一个应用程序,并将为此目的生成一个适当的Makefile(或等效文件)。
下表总结了可用的项目类型,并描述了qmake将为其生成的文件:
该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.)
}
这使得可以定义release和debug构建不同的配置。有关更多信息,请参见使用范围。
以下选项定义了要构建的项目的类型。
注意: 这些选项中的某些选项仅在相关平台上使用时才生效。
选项 | 描述 |
---|---|
qt | 该项目是Qt应用程序,应链接到Qt库。您可以使用QT变量来控制应用程序所需的任何其他Qt模块。默认情况下会添加此值,但是您可以将其删除以将qmake用于非Qt项目。 |
x11 | 该项目是X11应用程序或库。如果目标使用Qt,则不需要此值。 |
该应用程序和库项目模板为您提供更专业的配置选项微调构建过程。在“ 构建常用项目类型”中详细说明了这些选项。
例如,如果您的应用程序使用Qt库,并且您想以debug模式构建它,则您的项目文件将包含以下行:
CONFIG += qt debug
注意: 您必须使用“ + =”,而不是“ =”,否则qmake将无法使用Qt的配置来确定项目所需的设置。
如果CONFIG变量包含该qt值,则启用qmake对Qt应用程序的支持。这样可以对应用程序使用哪个Qt模块进行微调。这是通过QT变量实现的,该变量可用于声明所需的扩展模块。例如,我们可以通过以下方式启用XML和网络模块:
QT += network xml
注意:默认情况下QT包括core和gui模块,因此上述声明将网络和XML模块添加到此默认列表中。以下分配忽略了默认模块,并且在编译应用程序的源代码时将导致错误:
QT = network xml # This will omit the core and gui modules.
如果你想建立一个项目没有的gui模块,你需要与排除“ - =”操作符。默认情况下,QT包含core和gui,因此以下行将导致构建最小的Qt项目:
QT -= gui # Only the core module is used.
有关可以添加到QT变量的Qt模块的列表,请参见QT。
可以使用功能(.prf)文件中指定的其他配置功能来设置qmake。这些额外的功能通常为在构建过程中使用的自定义工具提供支持。要将功能添加到构建过程中,请将功能名称(功能文件名的词干)附加到CONFIG变量中。
例如,qmake可以将构建过程配置为利用pkg-config支持的外部库,例如D-Bus和ogg库,并包含以下几行:
配置+ = link_pkgconfig
PKGCONFIG + = ogg dbus - 1
有关添加功能的更多信息,请参见添加新的配置功能。
如果您正在项目中使用Qt随附的库以外的其他库,则需要在项目文件中指定它们。
可以将qmake搜索库的路径以及要链接的特定库添加到LIBS变量的值列表中。您可以指定库的路径,也可以使用Unix样式的符号来指定库和路径。
例如,以下几行显示了如何指定库:
LIBS += -L/usr/local/lib -lmath
也可以使用INCLUDEPATH变量以类似方式指定包含头文件的路径。
例如,要添加几个要搜索的头文件路径:
INCLUDEPATH = c:/msdev/include d:/stl/include
本章介绍如何为基于Qt的三种常见项目类型设置qmake项目文件:应用程序,库和插件。尽管所有项目类型都使用许多相同的变量,但是它们每个都使用特定于项目的变量来自定义输出文件。
此处不介绍特定于平台的变量。有关更多信息,请参阅Windows 的Qt- 部署和macOS的Qt。
该app模板告诉qmake生成将生成应用程序的Makefile。使用此模板,可以通过在