qmake工具有助于简化跨平台项目的开发构建过程。qmake自动生成Makefiles,这样只需要几行信息就可以创建Makefile。您可以在任何软件项目中使用qmake,无论是否使用Qt编写。
qmake根据项目文件中的信息生成一个Makefile。项目文件是由开发人员创建的,通常很简单,但是可以为复杂的项目创建更复杂的项目文件。
qmake包含额外的功能来支持Qt的开发,自动包含moc和uic的构建规则。
qmake也可以为Microsoft Visual Studio生成项目,而不需要开发人员更改项目文件。
qmake工具为您提供了一个面向项目的系统,用于管理应用程序,库和其他组件的构建过程。这种方法可以控制所使用的源文件,并且可以简单地在一个文件中描述流程中的每个步骤。 qmake将每个项目文件中的信息展开为一个Makefile,该Makefile执行编译和链接所需的命令。
项目由项目(.pro)文件的内容描述。 qmake使用文件中的信息来生成Makefile,其中包含构建每个项目所需的所有命令。项目文件通常包含源文件和头文件的列表,常规配置信息以及任何应用程序特定的详细信息,例如要链接的额外库的列表,或者要使用的额外包含路径的列表。
项目文件可以包含许多不同的元素,包括注释,变量声明,内置函数和一些简单的控制结构。在大多数简单的项目中,只需要使用一些基本的配置选项来声明用于构建项目的源文件和头文件。有关如何创建简单项目文件的更多信息,请参阅入门。
您可以为复杂的项目创建更复杂的项目文件。有关项目文件的概述,请参阅创建项目文件。有关可以在项目文件中使用的变量和函数的详细信息,请参阅参考。
您可以使用应用程序或库项目模板来指定专门的配置选项来微调构建过程。有关更多信息,请参阅构建常用项目类型。
您可以使用Qt Creator新建项目向导来创建项目文件。您选择项目模板,Qt Creator将创建一个项目文件,其默认值使您可以构建和运行项目。您可以修改项目文件以适合您的目的。
您也可以使用qmake生成项目文件。有关qmake命令行选项的完整说明,请参阅运行qmake。
qmake的基本配置功能可以处理大多数跨平台项目。但是,使用一些平台特定的变量可能是有用的,甚至是必要的。有关更多信息,请参阅平台注释。
对于简单的项目,只需要在项目的顶层目录中运行qmake来生成一个Makefile。然后你可以运行你的平台的make工具来根据Makefile建立项目。
有关qmake在配置构建过程时使用的环境变量的更多信息,请参阅配置qmake。
第三方库指南向你展示了如何在你的Qt项目中使用简单的第三方库。
在大型项目中,可以利用预编译的头文件加快构建过程。有关更多信息,请参阅使用预编译头。
本教程向您介绍qmake的基础知识。本手册中的其他主题包含有关使用qmake的更多详细信息。
假设您刚刚完成了应用程序的基本实现,并且已经创建了以下文件:
您将在Qt发行版的examples/qmake/tutorial
目录中找到这些文件。关于应用程序设置的唯一的另外一件事是它是用Qt编写的。首先,使用您最喜欢的纯文本编辑器,在examples/qmake/tutorial
中创建一个名为hello.pro
的文件。你需要做的第一件事是添加行,告诉qmake
关于作为开发项目一部分的源文件和头文件。
我们将首先将源文件添加到项目文件中。要做到这一点,你需要使用SOURCES
变量。只需用SOURCES + =
开始一个新行,然后放入hello.cpp
。你应该有这样的东西:
SOURCES + = hello.cpp
我们重复这个项目中的每个源文件,直到我们结束如下:
SOURCES + = hello.cpp
SOURCES + = main.cpp
如果你喜欢使用Make-like
的语法,把所有的文件意义出来,你可以像下面这样使用换行符:
SOURCES = hello.cpp \
main.cpp
现在源文件已经列在项目文件中了,头文件必须被添加。除了我们使用的变量名是HEADERS
之外,这些都以与源文件完全相同的方式添加。
一旦你完成了这个,你的项目文件应该是这样的:
HEADERS + = hello.h
SOURCES + = hello.cpp
SOURCES + = main.cpp
目标名称是自动设置的。它与项目文件名相同,但具有适合该平台的后缀。例如,如果项目文件名为hello.pro,则目标将是Windows上的hello.exe和Unix上的hello。如果你想使用不同的名字,你可以在项目文件中设置它:
TARGET = helloworld
完成的项目文件应该是这样的:
HEADERS + = hello.h
SOURCES + = hello.cpp
SOURCES + = main.cpp
您现在可以使用qmake为您的应用程序生成一个Makefile。在命令行上的项目目录中,键入以下内容:
qmake -o Makefile hello.pro
然后根据你使用的编译器输入make
或者nmake
。
对于Visual Studio用户,qmake
也可以生成Visual Studio项目文件。例如:
qmake -tp vc hello.pro
应用程序的发行版本不包含任何调试符号或其他调试信息。在开发过程中,生成具有相关信息的应用程序的调试版本很有用。通过在项目文件中添加调试到CONFIG
变量可以轻松实现。
例如:
CONFIG + = debug
HEADERS + = hello.h
SOURCES + = hello.cpp
SOURCES + = main.cpp
像以前一样使用qmake
来生成一个Makefile
。在调试环境中运行应用程序时,您将获得有关您的应用程序的有用信息。
经过几个小时的编码之后,您可能已经开始了应用程序的平台特定部分,并决定将平台相关代码分开。所以你现在有两个新的文件包含到你的项目文件中: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
。我们可以通过使用exists()
函数来检查文件是否存在。我们可以通过使用error()
函数来阻止qmake
的处理。这与作用域相同。只需用功能替换作用域条件即可。检查名为main.cpp的文件如下所示:
!exists(main.cpp){
error("No main.cpp file found")
}
那!
符号用于否定测试。也就是说,如果文件存在,exists(main.cpp)
为true
,如果文件不存在,则存在!exists(main.cpp)
为true
。
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")
}
像以前一样使用qmake
来生成一个makefile
。如果暂时修改main.cpp
名称,您将看到该消息,并且qmake
将停止处理。
假设你使用Windows,并且希望在命令行上运行应用程序时能够看到使用qDebug()
的语句输出。要查看输出,您必须使用适当的控制台设置来构建您的应用程序。我们可以很容易地把控制台放在CONFIG
行,把这个设置包含在Windows的Makefile
中。但是,假设我们只想在Windows上运行时添加CONFIG
行,并且已经在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
生成Makefile
时使用的另一个特殊变量。这在总体配置中进行了讨论。在上面的代码片段中,console
被添加到CONFIG
中包含的现有值列表中。
下表列出了一些常用的变量并描述了它们的内容。有关变量及其说明的完整列表,请参阅变量。
变量 | 内容 |
---|---|
CONFIG | 一般项目配置选项。 |
DESTDIR | 将放置可执行文件或二进制文件的目录。 |
FORMS | 由用户界面编译器(uic)处理的UI文件列表。 |
HEADERS | 构建项目时使用的头文件(.h)的文件名列表。 |
QT | 项目中使用的Qt模块列表。 |
SOURCES | 将包含在最终项目中的资源(.qrc)文件列表。有关这些文件的更多信息,请参阅The Qt Resource System |
SOURCES | 构建项目时要使用的源代码文件列表。 |
TEMPLATE | 用于该项目的模板。这决定了构建过程的输出是一个应用程序,一个库还是一个插件。 |
变量的内容可以通过将变量名加上$$
来读取。这可以用来将一个变量的内容分配给另一个变量:
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.
要在变量赋值中包含#
字符,就必须使用内置的LITERAL_HASH
变量的内容。
qmake
提供了一些内置的函数来使变量的内容得到处理。简单项目文件中最常用的函数是include()
函数,它将文件名作为参数。给定文件的内容包含在使用include
功能的项目文件中。include
函数最常用于包含其他项目文件:
include(other.pro)
对条件结构的支持可以通过在编程语言中像if
语句那样工作的作用域来实现:
win32 {
SOURCES + = paintwidget_win.cpp
}
大括号内的语句只有在条件为真的情况下才会进行。在这种情况下,必须设置win32 CONFIG
选项。这在Windows上自动发生。
通过find()
,unique()
和count()
等内置函数提供对通常需要循环的变量更复杂操作。这些函数以及其他函数提供了操作字符串和路径,支持用户输入以及调用外部工具的功能。有关使用函数的更多信息,请参阅qmake语言。有关所有功能及其说明的列表,请参阅替换功能和测试功能。
TEMPLATE
变量用于定义将要构建的项目的类型。如果没有在项目文件中声明,那么qmake
假定应该建立一个应用程序,并为此目的生成一个合适的Makefile
(或等价的文件)。
下表总结了可用项目的类型,并描述了qmake
将为每个项目生成的文件:
模板 | qmake输出 |
---|---|
app (default) | 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
变量用于包含要处理的所有子目录的列表。
CONFIG
变量指定了项目应该配置的选项和功能。
该项目可以建立在release模式或debug模式下,或两者兼有。如果指定了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模块。这个值是默认添加的,但是你可以删除它来为非Qt项目使用qmake。 |
x11 | 该项目是一个X11应用程序或库。如果目标使用Qt,则不需要此值。 |
应用程序和库项目模板为您提供更多专门的配置选项来微调构建过程。常用项目类型中详细介绍了这些选项。
例如,如果您的应用程序使用Qt库并且想要以debug模式构建它,那么您的项目文件将包含以下行:
CONFIG += qt debug
注意:您必须使用"+="
,而不是"="
或qmake
如果CONFIG
变量包含qt
值,则启用qmake
对Qt应用程序的支持。这样可以调整应用程序使用哪个Qt模块。这是通过QT变量来实现的,它可以用来声明所需的扩展模块。例如,我们可以通过以下方式启用xml
和network
模块:
QT += network xml
注意:QT默认包含core
和gui
模块,所以上面的声明将network
和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
库),其中包含以下几行:
CONFIG + = 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
项目文件:application
,library
和plugin
。虽然所有项目类型都使用许多相同的变量,但是每个项目都使用项目特定的变量来自定义输出文件。
这里不介绍平台特定的变量。有关更多信息,请参阅 Qt for Windows - Deployment and Qt for macOS。
应用程序模板告诉qmake
生成一个将生成应用程序的Makefile
。使用此模板,可以通过将以下选项之一添加到CONFIG
变量定义来指定应用程序的类型:
选项 | 描述 |
---|---|
windows | 该应用程序是一个Windows GUI应用程序。 |
console | 仅限应用程序模板:应用程序是Windows控制台应用程序。 |
testcase | 该应用程序是一个自动测试。 |
使用这个模板时,以下的qmake
系统变量被识别。您应该在.pro
文件中使用这些文件来指定有关您的应用程序的信息。对于额外的平台相关的系统变量,您可以查看平台注释。
你只需要使用你需要的系统变量。例如,如果你没有任何额外的INCLUDEPATH
,那么你不需要指定任何。 qmake
将添加必要的默认值。示例项目文件可能如下所示:
TEMPLATE = app
DESTDIR = c:/helloapp
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
DEFINES += USE_MY_STUFF
CONFIG += release
对于单值的项目,如模板或目标目录,我们使用"="
;但对于多值项目,我们使用"+="
添加到该类型的现有项目。使用"="
用新值替换变量值。例如,如果我们写DEFINES = USE_MY_STUFF
,所有其他的定义都被删除。
一个测试用例项目是一个应用程序项目,旨在作为一个自动化测试运行。任何应用程序都可以通过将值testcase
添加到CONFIG
变量来标记为测试用例。
对于测试用例项目,qmake
会在生成的Makefile
中插入一个检查目标。这个目标将运行该应用程序。如果测试已退出代码等于零结束,则认为测试通过。
检查目标自动递归通过SUBDIRS
项目。这意味着可以从SUBDIRS
项目中发出make check
命令来运行整个测试套件。
检查目标的执行可能由某些Makefile
变量定制。这些变量是:
变量 | 描述 |
---|---|
TESTRUNNER | 每个测试命令都有一个命令或shell片段。一个示例用例是一个”timeout”脚本,如果它在指定的时间内没有完成,它将终止一个测试。 |
TESTARGS | 附加到每个测试命令的附加参数。例如,传递额外的参数来设置测试的输出文件和格式(例如QTestLib所支持的-o 文件名,格式选项)可能是有用的。 |
注意:必须在调用make
工具时设置变量,而不是在.pro
文件中。大多数make
工具都支持直接在命令行上设置Makefile
变量:
# Run tests through test-wrapper and use xunitxml output format.
# In this example, test-wrapper is a fictional wrapper script which terminates
# a test if it does not complete within the amount of seconds set by "--timeout".
# The "-o result.xml,xunitxml" options are interpreted by QTestLib.
make check TESTRUNNER="test-wrapper --timeout 120" TESTARGS="-o result.xml,xunitxml"
可以使用以下CONFIG
选项进一步定制测试用例项目:
选项 | 描述 |
---|---|
insignificant_test | 在检查过程中,测试的退出代码将被忽略。 |
通常使用QTest或TestCase编写测试用例,但这不是使用CONFIG + = testcase
进行检查的必要条件。唯一的主要要求是测试程序在成功时退出,退出代码为零,失败时退出代码为非零。
lib
模板告诉qmake
生成一个Makefile
来构建一个库。使用此模板时,除了应用程序模板支持的系统变量之外,还支持VERSION
变量。使用.pro
文件中的变量来指定关于库的信息。
使用lib
模板时,可以将以下选项添加到CONFIG
变量中,以确定构建的库的类型:
选项 | 描述 |
---|---|
dll | 该库是一个共享库(dll)。 |
staticlib | 该库是一个静态库。 |
plugin | 该库是一个插件。 |
还可以定义以下选项来提供有关该库的其他信息。
库的目标文件名是平台相关的。例如,在X11,macOS和iOS上,库名称将以lib
为前缀。在Windows上,没有前缀被添加到文件名称。
如前一节所述,插件是使用lib
模板构建的。这告诉qmake
为项目生成一个Makefile
文件,该文件将以适当的形式为每个平台构建一个插件,通常以库的形式。和普通的库一样,VERSION
变量用来指定插件的信息。
Qt Designer插件是使用一组特定的配置设置构建的,这些配置设置取决于为您的系统配置Qt的方式。为方便起见,可以通过将设计器添加到QT变量来启用这些设置。例如:
QT += widgets designer
有关基于插件的项目的更多示例,请参阅Qt Designer示例。
有时候,有必要在调试和发布模式下建立一个项目。虽然CONFIG
变量可以同时包含debug和release选项,但只应用最后指定的选项。
要在两种模式下建立项目,您必须将debug_and_release
选项添加到CONFIG
变量中:
CONFIG += debug_and_release
CONFIG(debug, debug|release) {
TARGET = debug_binary
} else {
TARGET = release_binary
}
上面代码片段作用域中修改了每种模式下的构建目标,以确保生成的目标具有不同的名称。为目标提供不同的名称可确保不会覆盖另一个名称。
当qmake
处理项目文件时,它将生成一个Makefile
以允许在两种模式下构建项目。这可以通过以下方式调用:
make all
可以将build_all
选项添加到项目文件中的CONFIG
变量,以确保默认情况下在两种模式下构建项目:
CONFIG + = build_all
这允许使用默认规则处理Makefile
:
make
在两种模式下安装 build_all
选项还可确保在调用安装规则时安装两个版本的目标:
make install
可以根据目标平台自定义构建目标的名称。例如,一个库或插件可以在Windows平台上使用不同的约定来命名:
CONFIG(debug, debug|release) {
mac: TARGET = $$join(TARGET,,,_debug)
win32: TARGET = $$join(TARGET,,d)
}
上述片段中的缺省行为是在debug
模式下构建时修改用于构建目标的名称。可以将一个else
子句添加到作用域中,以对发布模式执行相同的操作。保持原样,目标名称保持不变。
qmake的行为可以通过在命令行中指定各种选项来运行。这些允许构建过程进行微调,提供有用的诊断信息,并可用于指定项目的目标平台。
用于运行qmake
的语法采用以下简单的形式:
qmake [mode] [options] files
qmake
支持两种不同的操作模式。在默认模式下,qmake
使用项目文件中的信息来生成Makefile
,但也可以使用qmake
生成项目文件。如果要明确设置模式,则必须在所有其他选项之前指定它。该模式可以是以下两个值之一:
注意:创建的文件可能需要编辑。例如,添加QT变量以适应项目所需的模块。
您可以使用这些选项来指定常规和特定于模式的设置。 Makefile模式选项部分描述了仅适用于生成文件模式的选项,而项目模式选项部分则介绍了影响项目文件创建的选项。
files参数表示一个或多个项目文件的列表,以空格分隔。
可以在qmake
的命令行中指定各种选项,以便自定义构建过程并覆盖您的平台的默认设置。以下基本选项提供有关使用qmake
的帮助,指定qmake
写入输出文件的位置,以及控制将写入控制台的调试信息的级别:
-help
qmake将会继续这些功能并提供一些有用的帮助。
-o file
qmake输出将被定向到文件。如果没有指定这个选项,qmake会尝试使用一个合适的文件名作为它的输出,这取决于它运行的模式。
如果指定了“ - ”,则输出被定向到stdout。
-d
qmake会输出调试信息。多次添加-d会增加详细程度。
用于项目的模板通常由项目文件中的TEMPLATE变量指定。您可以使用以下选项覆盖或修改此项:
-t tmpl
qmake将用tmpl覆盖任何设置的TEMPLATE变量,但只有在.pro文件被处理之后。
-tp prefix
qmake会为TEMPLATE变量添加前缀。
可以对警告信息的级别进行微调,以帮助您在项目文件中找到问题:
-Wall
qmake会报告所有已知的警告。
-Wnone
qmake不会生成警告信息。
-Wparser
qmake只会生成解析器警告。这会提醒您在解析项目文件时常见的缺陷和潜在的问题。
-Wlogic
qmake会警告你的项目文件中常见的陷阱和潜在的问题。例如,qmake会报告多个文件列表中的文件和丢失的文件。
qmake -makefile [options] files
在Makefile
模式下,qmake
将生成一个用于构建项目的Makefile
。另外,在这种模式下可以使用以下选项来影响项目文件的生成方式:
-after
qmake会在指定的文件之后处理命令行上的赋值。
-nocache
qmake会忽略.qmake.cache文件。
-nodepend
qmake不会生成任何依赖信息。
-cache file
qmake将使用文件作为缓存文件,忽略任何其他找到的.qmake.cache文件。
-spec spec
qmake将使用spec作为平台和编译器信息的路径,而忽略QMAKESPEC的价值。
您也可以在命令行上传递qmake选项。在指定的所有文件之前处理它们。例如,以下命令从test.pro
生成一个Makefile
:
qmake -makefile -o Makefile "CONFIG+=test" test.pro
但是,某些指定的选项可以省略,因为它们是默认值:
qmake "CONFIG+=test" test.pro
如果您确定您希望在指定的文件之后处理变量,则可以传递-after
选项。指定此选项时,-after
选项之后的命令行上的所有分配都将被推迟,直到解析指定的文件为止。
qmake -project [options] files
在项目模式下,qmake
会生成一个项目文件。另外,您可以在此模式下提供以下选项:
-r
qmake会递归地查看提供的目录。
-nopwd
qmake不会在您的当前工作目录中查找源代码。它只会使用指定的文件。
在这种模式下,files参数可以是文件或目录的列表。如果指定了一个目录,它将被包含在DEPENDPATH
变量中,并且从那里的相关代码将包含在生成的项目文件中。如果给出了一个文件,它将被附加到正确的变量,这取决于它的扩展名。例如,将UI
文件添加到FORMS
,并将C++
文件添加到SOURCES
。
在这种模式下,您也可以在命令行上传递任务。这样做时,这些分配将被放置在生成的项目文件中。
许多跨平台的项目可以通过基本的qmake
配置功能来处理。但是,在某些平台上,有时甚至有必要利用特定于平台的功能。 qmake
知道许多这些功能,可以通过特定的变量进行访问,这些变量只会在相关的平台上生效。
特定于这些平台的功能包括支持创建通用二进制文件,框架和捆绑软件。
源代码包中提供的qmake
版本与二进制包中提供的版本稍有不同,因为它使用了不同的功能规范。在源代码包通常使用macx-g++
规范的情况下,二进制包通常被配置为使用macx-xcode
规范。
每个包的用户可以通过使用-spec
选项调用qmake
来覆盖此配置(请参阅运行qmake
以获取更多信息)。例如,要使用二进制包中的qmake
在项目目录中创建Makefile
,请调用以下命令:
qmake -spec macx-g++
qmake
能够自动生成构建规则,用于链接到位于/Library/Frameworks/的macOS上的标准框架目录中的框架。
需要将标准框架目录以外的目录指定给构建系统,这可以通过在LIBS
变量中附加链接器选项来实现,如以下示例所示:
LIBS += -F/path/to/framework/directory/
框架本身通过在LIBS
变量中附加-framework
选项和框架的名称来链接:
LIBS + = -framework TheFramework
任何给定的库项目都可以进行配置,以便将生成的库文件放置在框架中,以备部署。为此,请设置项目以使用lib
模板,并将lib_bundle
选项添加到CONFIG
变量中:
TEMPLATE = lib
CONFIG + = lib_bundle
与库相关的数据是使用QMAKE_BUNDLE_DATA
变量指定的。这包含将与库包一起安装的项目,通常用于指定头文件的集合,如以下示例所示:
FRAMEWORK_HEADERS.version = Versions
FRAMEWORK_HEADERS.files = path/to/header_one.h path/to/header_two.h
FRAMEWORK_HEADERS.path = Headers
QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS
您可以使用FRAMEWORK_HEADERS
变量来指定特定框架所需的头文件。将其附加到QMAKE_BUNDLE_DATA
变量可确保将有关这些标头的信息添加到将与库软件包一起安装的资源集合中。此外,框架名称和版本由QMAKE_FRAMEWORK_BUNDLE_NAME
和QMAKE_FRAMEWORK_VERSION
变量指定。默认情况下,用于这些变量的值是从TARGET
和VERSION
变量中获得的。
有关部署应用程序和库的更多信息,请参阅Qt for macOS - Deployment。
macOS上的开发人员可以利用Qmake
对Xcode
项目文件的支持,如Qt for macOS文档中所述。通过运行qmake
从现有的qmake
项目文件生成一个Xcode
项目。例如:
qmake -spec macx-xcode project.pro
注意:如果稍后在磁盘上移动项目,则必须再次运行qmake
来处理项目文件并创建新的Xcode
项目文件。
实现这个目前是不可行的,因为Xcode
的主动构建配置的概念与构建目标的qmake
概念在概念上是不同的。
Xcode
活动构建配置设置用于修改Xcode
配置,编译器标志和类似的构建选项。与Visual Studio不同,Xcode
不允许根据是否选择调试版本或发行版本配置来选择特定的库文件。 qmake
调试和发布设置控制哪些库文件链接到可执行文件。
目前无法从qmake
生成的Xcode
项目文件中设置Xcode
配置设置中的文件。 Xcode
构建系统中框架和库阶段链接库的方式。
此外,所选的活动构建配置存储在.pbxuser
文件中,该文件由Xcode
在第一次加载时生成,而不是由qmake
创建。
特定于此平台的功能包括对Windows
资源文件(提供的或自动生成的)的支持,创建Visual Studio项目文件和部署使用Visual Studio 2005开发的Qt应用程序时处理清单文件。
本节介绍如何使用qmake
处理Windows资源文件,以使其链接到应用程序可执行文件(EXE)或动态链接库(DLL)。 qmake
可以选择自动生成一个适当填充的Windows资源文件。
链接的Windows资源文件可能包含许多可以通过其EXE或DLL访问的元素。但是,Qt资源系统应该用于以平台无关的方式访问链接资源。但是链接的Windows资源文件的一些标准元素是由Windows本身访问的。例如,在Windows资源管理器中,文件属性的版本选项卡由资源元素填充。另外,从这些元素中读取EXE的程序图标。所以Qt创建的Windows EXE或DLL同时使用这两种技术是很好的做法:通过Qt资源系统链接独立于平台的资源,并通过Windows资源文件添加Windows特定的资源。
通常,资源定义脚本(.rc文件)被编译为Windows资源文件。在Microsoft工具链中,RC工具生成一个.res
文件,该文件可以与Microsoft链接器链接到一个EXE或DLL。 MinGW工具链使用windres工具生成一个.o
文件,该文件可以与MinGW链接器链接到一个EXE或DLL。
通过设置至少一个系统变量VERSION
和RC_ICONS
来触发由qmake
自动生成适当填充的.rc
文件。生成的.rc
文件自动编译并链接。添加到.rc
文件中的元素由系统变量QMAKE_TARGET_COMPANY
,QMAKE_TARGET_DESCRIPTION
,QMAKE_TARGET_COPYRIGHT
,QMAKE_TARGET_PRODUCT
,RC_CODEPAGE
,RC_ICONS
,RC_LANG
和VERSION
定义。
如果这些元素是不够的,qmake
有两个系统变量RC_FILE
和RES_FILE
,直接指向一个外部创建的.rc
或.res
文件。通过设置这些变量之一,指定的文件链接到EXE
或DLL
。
注意:如果设置了RC_FILE
或RES_FILE
,则qmake
生成的.rc
文件被阻塞。在这种情况下,qmake
不会对给定的.rc
文件或.res
或.o
文件做进一步的修改;与.rc
文件生成有关的变量不起作用。
本节介绍如何将现有的qmake
项目导入到Visual Studio中。 qmake
能够获取项目文件并创建一个Visual Studio项目,其中包含开发环境所需的所有必要信息。这是通过将qmake
项目模板设置为vcapp
(用于应用程序项目)或vclib
(用于库项目)来实现的。
这也可以使用命令行选项来设置,例如:
qmake -tp vc
通过输入以下命令,可以递归地在子目录中生成.vcproj
文件,在主目录中生成.sln
文件:
qmake -tp vc -r
每次更新项目文件时,都需要运行qmake
来生成更新的Visual Studio项目。
注意:如果使用的是Visual Studio加载项,请选择Qt > 从.pro
文件导入以导入.pro
文件。
部署使用Visual Studio 2005或更高版本构建的Qt应用程序时,请确保正确处理应用程序链接时创建的清单文件。这将自动处理生成DLL的项目。
删除应用程序可执行文件的清单嵌入可以通过以下对CONFIG
变量的赋值来完成:
CONFIG -= embed_manifest_exe
此外,DLL的清单嵌入可以通过以下分配给CONFIG
变量来删除:
CONFIG -= embed_manifest_dll
这在Windows的部署指南中有更详细的讨论。
许多qmake
项目文件使用name = value
和name + = value
定义列表来简单描述项目使用的源文件和头文件。 qmake
还提供了其他操作符,函数和范围,可用于处理变量声明中提供的信息。这些高级功能允许从单个项目文件为多个平台生成Makefiles
。
在许多项目文件中,可以使用赋值(=)和附加(+ =)运算符来包含有关项目的所有信息。典型的使用模式是将一个值列表分配给一个变量,并根据各种测试的结果附加更多的值。由于qmake
使用默认值定义了某些变量,因此有时需要使用去除( - =)运算符来过滤不需要的值。以下各节介绍如何使用操作符来操作变量的内容。
=
运算符为一个变量赋值:
TARGET = myapp
上面的行将TARGET
变量设置为myapp
。这将覆盖之前为myapp
设置的TARGET
值。
+=
运算符将一个新值附加到变量中的值列表中:
DEFINES -= USE_MY_STUFF
上面的行将USE_MY_STUFF
附加到预处理器定义列表中,放入生成的Makefile
中。
-=
操作符从一个变量中的值列表中删除一个值:
DEFINES -= USE_MY_STUFF
上面的行从预处理器定义列表中删除USE_MY_STUFF
,将其放入生成的Makefile
中。
*=
操作符将值添加到变量中的值列表中,但只有在该值不存在的情况下。这可以防止值被多次包含在一个变量中。例如:
DEFINES *= USE_MY_STUFF
在上面的行中,USE_MY_STUFF
只会被添加到预处理器定义列表中(如果尚未定义的话)。请注意,unique()
函数也可用于确保变量只包含每个值的一个实例。
〜=
运算符用指定的值替换与正则表达式匹配的任何值:
DEFINES ~= s/QT_[DT].+/QT
在上面的行中,列表中以QT_D
或QT_T
开头的任何值都将被替换为QT。
$$
运算符用于提取变量的内容,并可用于在变量之间传递值或将其提供给函数:
EVERYTHING = $$SOURCES $$HEADERS
message("The project contains the following files:")
message($$EVERYTHING)
变量可以用来存储环境变量的内容。这些可以在运行qmake
时进行评估,或者在生成项目时生成的Makefile
中进行评估。
要在运行qmake
时获取环境值的内容,请使用$$(...)
运算符:
DESTDIR = $$(PWD)
message(The project will be installed in $$DESTDIR)
在上面的分配中,当处理项目文件时读取PWD
环境变量的值。
要在生成的Makefile
处理时获取环境值的内容,请使用$(...)
运算符:
DESTDIR = $$(PWD)
message(The project will be installed in $$DESTDIR)
DESTDIR = $(PWD)
message(The project will be installed in the value of PWD)
message(when the Makefile is processed.)
在上面的分配中,处理项目文件时会立即读取PWD
的值,但在生成的Makefile
中将$(PWD)
分配给DESTDIR
。这使得构建过程更加灵活,只要在处理Makefile
时正确设置环境变量即可。
$$[...]
操作符可用于访问qmake
属性:
message(Qt version: $$[QT_VERSION])
message(Qt is installed in $$[QT_INSTALL_PREFIX])
message(Qt resources can be found in the following locations:)
message(Documentation: $$[QT_INSTALL_DOCS])
message(Header files: $$[QT_INSTALL_HEADERS])
message(Libraries: $$[QT_INSTALL_LIBS])
message(Binary files (executables): $$[QT_INSTALL_BINS])
message(Plugins: $$[QT_INSTALL_PLUGINS])
message(Data files: $$[QT_INSTALL_DATA])
message(Translation files: $$[QT_INSTALL_TRANSLATIONS])
message(Settings: $$[QT_INSTALL_CONFIGURATION])
message(Examples: $$[QT_INSTALL_EXAMPLES])
有关更多信息,请参阅配置qmake
。
这个操作符可以访问的属性通常用于使第三方插件和组件集成到Qt中。例如,如果在其项目文件中进行了以下声明,则可以将Qt Designer插件与Qt Designer的内置插件一起安装:
target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS += target
范围与过程式编程语言中的if
语句相似。如果某个条件成立,则范围内的声明将被处理。
作用域包括一个条件,在同一行上有一个左大括号,一系列命令和定义,以及一个新行上的右大括号:
{
...
}
大括号必须与条件写在同一行上。范围可以连接成包含多个条件,如以下各节所述。
作用域被写为一个条件,后面跟着一对括号中的一系列声明。例如:
win32 {
SOURCES += paintwidget_win.cpp
}
上面的代码将在构建Windows平台时将paintwidget_win.cpp
文件添加到生成的Makefile
中列出的源文件中。在为其他平台构建时,定义将被忽略。
在一个给定的范围中使用的条件也可以被否定,以提供一个替代的一组声明,只有当原始条件是错误时才会被处理。例如,要为Windows以外的所有平台构建时处理某些内容,请取消这样的作用域:
!win32 {
SOURCES -= paintwidget_win.cpp
}
作用域可以嵌套以结合多个条件。例如,只有在启用调试的情况下才能为特定平台包含特定文件,请编写以下内容:
macx {
CONFIG(debug, debug|release) {
HEADERS += debugging.h
}
}
为了节省编写很多嵌套的作用域,可以使用:运算符来嵌套作用域。上面例子中的嵌套作用域可以用下面的方法重写:
macx:CONFIG(debug, debug|release) {
HEADERS += debugging.h
}
您也可以使用:
运算符来执行单行条件分配。例如:
win32:DEFINES += USE_MY_STUFF
仅当为Windows平台构建时,以上行将USE_MY_STUFF
添加到DEFINES
变量。通常,:
运算符的行为就像一个逻辑AND
运算符,将许多条件连接在一起,并要求所有这些条件成立。
还有|
运算符像一个逻辑OR
运算符一样,将多个条件连接在一起,并且只要求其中的一个为真。
win32|macx {
HEADERS += debugging.h
}
您还可以通过使用其他作用域来为范围内的提供替代声明。如果上述作用域的条件为假,则处理其他作用域。这样,您可以在与其他范围组合时编写复杂的测试(由上面的:
运算符分隔)。例如:
win32:xml {
message(Building for Windows)
SOURCES += xmlhandler_win.cpp
} else:xml {
SOURCES += xmlhandler.cpp
} else {
message("Unknown configuration")
}
存储在CONFIG
变量中的值由qmake
特别处理。每个可能的值都可以用作作用域的条件。例如,CONFIG
保存的值列表可以用opengl
值扩展:
CONFIG + = opengl
作为这个操作的结果,任何测试opengl
的作用域都将被处理。我们可以使用这个特性给最终的可执行文件一个合适的名字:
opengl {
TARGET = application-gl
} else {
TARGET = application
}
此功能可以轻松更改项目的配置,而不会丢失特定配置可能需要的所有自定义设置。在上面的代码中,第一个作用域中的声明被处理,最终的可执行文件将被称为application-gl
。但是,如果未指定opengl
,则将处理第二个作用域中的声明,而最终的可执行文件将被称为application
。
由于可以在CONFIG
行上放置自己的值,因此为您提供了一种方便的方式来自定义项目文件并对生成的Makefile
进行微调。
除了许多范围条件中使用的win32,macx和unix值以外,还可以使用作用域来测试各种其他内置平台和编译器特定的值。这些基于Qt的mkspecs
目录中提供的平台规范。例如,项目文件中显示了当前使用和测试linux-g++
的规范:
message($$QMAKESPEC)
linux-g++ {
message(Linux)
}
只要mkspecs
目录中存在规范,就可以测试任何其他平台 - 编译器组合。
项目文件中使用的许多变量是qmake
在生成Makefile
时使用的特殊变量,如DEFINES
,SOURCES
和HEADERS
。另外,您可以创建自己使用的变量。当qmake
遇到一个赋值给这个名字的时候,就会用给定的名字创建新的变量。例如:
MY_VARIABLE = value
对你自己的变量做什么没有限制,因为qmake
会忽略它们,除非需要在处理作用域时对它们进行评估。
您还可以通过给变量名加前缀$$
来将当前变量的值赋给另一个变量。例如:
MY_DEFINES = $$DEFINES
现在,MY_DEFINES
变量包含项目文件中此时的DEFINES
变量中的内容。这也等同于:
MY_DEFINES = $${DEFINES}
第二个符号允许您将变量的内容附加到另一个值,而不用两个空格分隔。例如,以下内容将确保最终的可执行文件将被赋予一个包含正在使用的项目模板的名称:
TARGET = myproject_$${TEMPLATE}
qmake
提供了一系列内置的函数来处理变量的内容。这些函数处理提供给它们的参数,并返回值或值列表。要将一个结果赋值给一个变量,可以使用这个类型的函数$$
操作符来将一个变量的内容赋值给另一个变量:
HEADERS = model.h
HEADERS += $$OTHER_HEADERS
HEADERS = $$unique(HEADERS)
这种类型的函数应该用在赋值的右边(即作为操作数)。
你可以定义你自己的函数来处理变量的内容,如下所示:
defineReplace(functionName){
#function code
}
以下示例函数将变量名称作为其唯一参数,使用eval()
内置函数从变量中提取值列表,并编译文件列表:
defineReplace(headersAndSources) {
variable = $$1
names = $$eval($$variable)
headers =
sources =
for(name, names) {
header = $${name}.h
exists($$header) {
headers += $$header
}
source = $${name}.cpp
exists($$source) {
sources += $$source
}
}
return($$headers $$sources)
}
qmake
提供的内置函数可以在编写作用域时用作条件。这些函数不会返回值,而是指示成功或失败:
count(options, 2) {
message(Both release and debug specified.)
}
这种类型的函数只能在条件表达式中使用。
可以定义你自己的函数来为范围提供条件。以下示例测试列表中的每个文件是否存在,如果全部存在,则返回true
否则返回false
:
defineTest(allFiles) {
files = $$ARGS
for(file, files) {
!exists($$file) {
return(false)
}
}
return(true)
}
qmake
允许你创建你自己的特性,通过将它们的名字添加到CONFIG
变量指定的值列表中,可以将其包含在项目文件中。功能是可以驻留在许多标准目录中的.prf
文件中的自定义函数和定义的集合。这些目录的位置在很多地方都有定义,当查找.prf
文件时,qmake
按照以下顺序检查它们:
QMAKEFEATURES
环境变量中列出的目录中,该目录包含由平台的路径列表分隔符(Unix的冒号,Windows的分号)分隔的目录列表。QMAKEFEATURES
属性变量中列出的目录中。mkspecs
目录内的功能目录中。mkspecs
目录可以位于QMAKEPATH
环境变量中列出的任何目录之下,其中包含由平台的路径列表分隔符分隔的目录列表。例如:$QMAKEPATH/mkspecs/
。QMAKESPEC
环境变量提供的目录下的一个功能目录中。例如:$QMAKESPEC/
。data_install/mkspecs
目录中的功能目录中。例如:data_install/mkspecs/
。QMAKESPEC
环境变量指定的目录的兄弟目录存在的特征目录中。例如:$QMAKESPEC/../
。以下功能目录将搜索功能文件:
例如,考虑项目文件中的以下分配:
CONFIG + = myfeatures
除了CONFIG
变量之外,qmake
在完成解析项目文件之后,将搜索上面列出的myfeatures.prf
文件的位置。在Unix系统上,它会查找以下文件:
$QMAKEFEATURES/myfeatures.prf
(对于QMAKEFEATURES
环境变量中列出的每个目录)$$QMAKEFEATURES/myfeatures.prf
(用于QMAKEFEATURES
属性变量中列出的每个目录)myfeatures.prf
(在项目的根目录下)$QMAKEPATH/mkspecs/features/unix/myfeatures.prf
和$QMAKEPATH/mkspecs/features/myfeatures.prf
(用于QMAKEPATH
环境变量中列出的每个目录)$QMAKESPEC/features/unix/myfeatures.prf
和$QMAKESPEC/features/myfeatures.prf
data_install/mkspecs/features/unix/myfeatures.prf
和data_install/mkspecs/features/myfeatures.prf
$QMAKESPEC/../features/unix/myfeatures.prf
和$QMAKESPEC/../features/myfeatures.prf
注:.prf
文件的名称必须小写。
在Unix上通常也使用构建工具来安装应用程序和库;例如,通过调用make install
。出于这个原因,qmake
有一个安装集的概念,一个对象,其中包含有关项目的一部分将被安装的方式的说明。例如,可以用以下方式描述文档文件集合:
documentation.path = /usr/local/program/doc
documentation.files = docs/*
路径成员通知qmake文件应该安装在/usr/local/program/doc
(路径成员)中,文件成员指定了应该复制到安装目录的文件。在这种情况下,docs目录中的所有内容都将被复制到/usr/local/program/doc
中。
一旦完整描述了安装集,您可以使用下面这行代码将其附加到安装列表中:
INSTALLS += documentation
qmake将确保指定的文件被复制到安装目录。如果您需要对此过程进行更多的控制,则还可以为对象的额外成员提供定义。例如,以下行告诉qmake为这个安装集执行一系列命令:
unix:documentation.extra = create_docs; mv master.doc toc.doc
unix范围确保这些特定的命令只在Unix平台上执行。其他平台的适当命令可以使用其他范围规则来定义。
在执行该对象的其他成员中的指令之前执行在该额外成员中指定的命令。
如果将一个内置的安装集添加到INSTALLS
变量中,并且不指定文件或额外的成员,则qmake
将决定需要为您复制的内容。目前,支持目标和dlltarget
安装集。例如:
target.path = /usr/local/myprogram
INSTALLS += target
在上面的几行中,qmake
知道需要复制什么,并自动处理安装过程。
qmake
试图做一切跨平台构建工具。当你真的需要运行特殊的平台相关的命令时,这往往不太理想。这可以通过对不同的qmake
后端的具体说明来实现。 Makefile
输出的定制是通过在qmake
的其他地方找到的对象风格的API来执行的。对象通过指定其成员来自动定义。例如:
mytarget.target = .buildfile
mytarget.commands = touch $$mytarget.target
mytarget.depends = mytarget2
mytarget2.commands = @echo Building $$mytarget.target
上面的定义定义了一个名为mytarget
的qmake
目标,其中包含一个名为.buildfile
的Makefile
目标,而该目标又是通过touch()
函数生成的。最后,.depends
成员指定mytarget
依赖mytarget2
,这是另一个之后定义的目标。 mytarget2
是一个虚拟目标。它只被定义为回显一些文本到控制台。
最后一步是使用QMAKE_EXTRA_TARGETS
变量来指示qmake
这个对象是要构建的目标:
QMAKE_EXTRA_TARGETS += mytarget mytarget2
这就是您需要做的实际构建自定义目标。当然,你可能想要将这些目标之一绑定到qmake
构建目标。为此,只需将您的Makefile
目标包含在PRE_TARGETDEPS
列表中。
自定义目标规范支持以下成员:
成员 | 描述 |
---|---|
commands | 用于生成自定义构建目标的命令。 |
CONFIG | 自定义构建目标的特定配置选项。可以设置递归来表示应该在Makefile中创建规则来调用子目标特定的Makefile中的相关目标。该成员默认为每个子目标创建一个条目。 |
depends | 自定义构建目标所依赖的现有构建目标。 |
recurse | 在Makefile中创建规则以调用子目标特定的Makefile时,指定应使用哪些子目标。该成员仅在CONFIG中设置递归时使用。典型的值是”Debug”和”Release”。 |
recurse_target | 指定应通过Makefile中的规则的子目标Makefile构建的目标。这个成员添加类似$(MAKE) -f Makefile。subtarget。该成员仅在CONFIG中设置递归时使用。 |
target | 自定义构建目标的名称。 |
可以定制qmake
来支持新的编译器和预处理器:
new_moc.output = moc_${QMAKE_FILE_BASE}.cpp
new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,,"
new_moc.input = NEW_HEADERS
QMAKE_EXTRA_COMPILERS += new_moc
有了上面的定义,如果有可用的话,你可以使用moc
替代。该命令在赋给NEW_HEADERS
变量的所有参数(来自输入成员)上执行,并将结果写入输出成员定义的文件。该文件被添加到项目中的其他源文件。此外,qmake
将执行depend_command
来生成依赖信息,并将这些信息放在项目中。
自定义编译器规范支持以下成员:
成员 | 描述 |
---|---|
commands | 用于从输入生成输出的命令。 |
CONFIG | 自定义编译器的特定配置选项。有关详细信息,请参阅CONFIG表。 |
depend_command | 指定用于生成输出的依赖关系列表的命令。 |
dependency_type | 指定输出文件的类型。如果它是已知类型(如TYPE_C,TYPE_UI,TYPE_QRC),则将其作为这些类型的文件之一进行处理。 |
depends | 指定输出文件的依赖关系。 |
input | 指定应该使用自定义编译器处理的文件的变量。 |
name | 自定义编译器正在做什么的描述。这只在一些后端使用。 |
output | 从自定义编译器创建的文件名。 |
output_function | 指定用于指定要创建的文件名的自定义qmake函数。 |
variables | 表示这里指定的变量被替换为$(QMAKE_COMP_VARNAME),在pro文件中被称为$(VARNAME)。 |
variable_out | 应该将从输出创建的文件添加到变量中。 |
CONFIG成员支持以下选项:
选项 | 描述 |
---|---|
combine | 指示将所有输入文件合并为一个输出文件。 |
target_predeps | 指示应将输出添加到PRE_TARGETDEPS列表中。 |
explicit_dependencies | 输出的依赖性只能从depends成员和其他地方生成。 |
no_link | 指示不应将输出添加到要链接的对象列表中。 |
通常,当链接到一个库时,qmake
依靠底层平台来知道这个库链接的其他库,并让平台把它们拉进来。然而,在许多情况下,这是不够的。例如,当静态链接一个库时,没有其他库链接到,因此不会创建这些库的依赖关系。然而,后来链接到这个库的应用程序需要知道在哪里可以找到静态库所需的符号。如果您明确启用了跟踪,qmake
会在适当的情况下尝试跟踪库的依赖关系。
第一步是在库本身中启用依赖关系跟踪。要做到这一点,你必须告诉qmake
保存有关库的信息:
CONFIG + = create_prl
这只与lib
模板相关,并且对于其他模板将被忽略。启用此选项后,qmake
将创建一个以.prl
结尾的文件,该文件将保存关于该库的一些元信息。这个元文件就像一个普通的项目文件,但只包含内部变量声明。当安装这个库时,通过在INSTALLS
声明中指定它作为目标,qmake
会自动将.prl
文件复制到安装路径。
这个过程的第二步是在使用静态库的应用程序中读取这个元信息:
CONFIG + = link_prl
当启用这个功能时,qmake
会处理应用程序链接的所有库,并找到他们的元信息。 qmake
将使用它来确定相关的链接信息,特别是将值添加到应用程序项目文件的DEFINES
列表以及LIBS
中。一旦qmake
处理完这个文件,它就会查看LIBS变量
中新引入的库,并找到它们的依赖.prl
文件,直到所有的库都被解析为止。在这一点上,像往常一样创建Makefile
,并且库与应用程序显式链接。
.prl
文件只能由qmake
创建,不能在操作系统之间传输,因为它们可能包含平台依赖信息。
预编译头(PCH)是一些编译器支持的性能特征,用于编译稳定的代码体,并将代码的编译状态存储在二进制文件中。在随后的编译期间,编译器将加载存储的状态,并继续编译指定的文件。每个后续的编译都会更快,因为稳定的代码不需要重新编译。
qmake
支持在某些平台上使用预编译头文件和构建环境,其中包括:
预编译头文件必须包含在整个项目中稳定和静态的代码。一个典型的预编译头文件可能如下所示:
// Add C includes here
#if defined __cplusplus
// Add C++ includes here
#include
#include
#include
#include // Qt includes
#include
#include
#include "thirdparty/include/libmain.h"
#include "my_stable_class.h"
...
#endif
注意:预编译头文件需要将C包括从C++包含中分离出来,因为C文件的预编译头文件可能不包含C++代码。
要使项目使用预编译头文件,只需要在项目文件中定义PRECOMPILED_HEADER
变量:
PRECOMPILED_HEADER = stable.h
qmake
将处理剩下的部分,以确保预编译头文件的创建和使用。你不需要在HEADERS
中包含预编译头文件,因为如果配置支持预编译头文件,qmake
会这样做。
针对Windows的MSVC和g++规范默认启用precompile_header
。
使用这个选项,你可能会触发项目文件中的条件块来添加使用预编译头文件的设置。例如:
precompile_header:!isEmpty(PRECOMPILED_HEADER) {
DEFINES += USING_PCH
}
有关可能的问题的说明
在某些平台上,预编译头文件的文件名后缀与其他目标文件的后缀相同。例如,以下声明可能会导致生成具有相同名称的两个不同的目标文件:
PRECOMPILED_HEADER = window.h
SOURCES = window.cpp
为了避免像这样的潜在冲突,给予预编译的头文件一个独特的名字。
您可以在Qt发行版的examples/qmake/precompile
目录中找到以下源代码: mydialog.ui
下图显示了Qt Creator设计模式下的mydialog.ui
文件。您可以在编辑模式下查看代码。
stable.h
/* Add C includes here */
#if defined __cplusplus
/* Add C++ includes here */
# include
# include
# include
# include
#endif
myobject.h
#include
class MyObject : public QObject
{
public:
MyObject();
~MyObject();
};
myobject.cpp
#include
#include
#include
#include "myobject.h"
MyObject::MyObject()
: QObject()
{ std::cout << "MyObject::MyObject()\n"; }
util.cpp
void util_function_does_nothing()
{
// Nothing here...
int x = 0;
++x;
}
main.cpp
#include
#include
#include
#include "myobject.h"
#include "mydialog.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MyObject obj;
MyDialog dialog;
dialog.connect(dialog.aButton, SIGNAL(clicked()), SLOT(close()));
dialog.show();
return app.exec();
}
precompile.pro
TEMPLATE = app
LANGUAGE = C++
CONFIG += console precompile_header
CONFIG -= app_bundle
# Use Precompiled headers (PCH)
PRECOMPILED_HEADER = stable.h
HEADERS = stable.h \
mydialog.h \
myobject.h
SOURCES = main.cpp \
mydialog.cpp \
myobject.cpp \
util.cpp
FORMS = mydialog.ui
qmake
有一个持久化配置的系统,它允许你在qmake
中设置一次属性,每次调用qmake
时都会查询它。你可以在qmake
中设置一个属性如下:
qmake -set PROPERTY VALUE
PROPERTY
和VALUE
应取代适当的属性和值。
你可以从qmake
中获取这个信息,如下所示:
qmake -query PROPERTY
qmake -query #queries all current PROPERTY/VALUE pairs
注意:除了使用qmake -set PROPERTY VALUE
设置的属性之外,qmake -query
还会列出内置属性。
这些信息将被保存到一个QSettings
对象中(这意味着它将被存储在不同平台的不同地方)。
以下列表总结了内置属性:
例如,您可以使用QT_INSTALL_PREFIX
属性来查询此版本的qmake
的Qt安装:
qmake -query "QT_INSTALL_PREFIX"
您可以按如下方式查询项目文件中的属性值:
QMAKE_VERS = $$[QMAKE_VERSION]
qmake
需要一个平台和编译器描述文件,其中包含许多用于生成适当的Makefile
的默认值。标准的Qt发行版附带了许多这些文件,位于Qt安装的mkspecs
子目录中。
QMAKESPEC
环境变量可以包含以下任何一个:
QLibraryInfo :: DataPath
)。注意:在INCLUDEPATH
系统变量的内容之后,QMAKESPEC
路径将自动添加到生成的Makefile
中。
缓存文件是qmake
读取的特殊文件,用于查找qmake.conf
文件,项目文件或命令行中未指定的设置。运行qmake
时,除非指定-nocache
,否则它会在当前目录的父目录中查找名为.qmake.cache
的文件。如果qmake
无法找到这个文件,它会默默地忽略这个处理步骤。
如果qmake
找到一个.qmake.cache
文件,那么它将在处理该项目文件之前先处理这个文件。
在正常情况下,qmake
会尝试为您的平台使用适当的文件扩展名。但是,有时需要重写每个平台的默认选项,并明确定义要使用的qmake
的文件扩展名。这是通过重新定义某些内置变量来实现的。例如,用于moc
文件的扩展名可以在项目文件中使用以下分配来重新定义:
QMAKE_EXT_MOC = .mymoc
以下变量可用于重新定义由qmake
识别的常用文件扩展名:
以上所有接受的只是第一个值,所以您必须为其分配一个将在整个项目文件中使用的值。有两个变量接受一个值列表:
参考部分详细描述了可用于qmake
项目文件的变量和函数。
变量描述了在为项目配置构建过程时由qmake
识别的变量。
有两种类型的qmake
功能:替换功能和测试功能。 替换函数返回一个值列表,而测试函数返回一个布尔结果。 这些功能在两个地方实现:基本功能作为内置功能提供。 功能文件库(.prf
)中实现了更复杂的功能。
功能根据其类型分为几类:
qmake
的基本行为受变量声明的影响,变量声明定义了每个项目的构建过程。其中一些声明资源,如标题和源文件,是每个平台的共同点。其他用于定制特定平台上编译器和链接器的行为。
特定于平台的变量遵循它们扩展或修改的变量的命名模式,但在其名称中包含相关平台的名称。例如,QMAKE_LIBS
可用于指定项目需要链接的库的列表,QMAKE_LIBS_X11
可用于扩展或覆盖此列表。
指定项目配置和编译器选项。这些值由qmake
内部认可,具有特殊的意义。
以下CONFIG
值控制编译标志:
选项 | 描述 |
---|---|
release | 该项目将建立在发布模式。如果还指定了调试,则最后一个生效。 |
debug | 该项目将以调试模式构建。 |
debug_and_release | 该项目准备建立在调试和发布模式。 |
debug_and_release_target | 这个选项是默认设置的。如果还设置了debug_and_release,那么调试版本和发行版本将在单独的调试版本和发行版目录中结束。 |
build_all | 如果指定了debug_and_release,则默认情况下,项目将以调试模式和释放模式构建。 |
autogen_precompile_source | 自动生成一个.cpp文件,其中包含.pro文件中指定的预编译头文件。 |
ordered | 当使用subdirs模板时,这个选项指定列出的目录应该按照给定的顺序处理。 |
precompile_header | 支持在项目中使用预编译头文件。 |
warn_on | 编译器应输出尽可能多的警告。如果还指定了warn_off,则最后一个生效。 |
warn_off | 编译器应该输出尽可能少的警告。 |
exceptions | 异常支持已启用。默认设置。 |
exceptions_off | 异常支持被禁用。 |
rtti | RTTI支持已启用。默认情况下,使用编译器默认值。 |
rtti_off | RTTI支持被禁用。默认情况下,使用编译器默认值。 |
stl | STL支持已启用。默认情况下,使用编译器默认值。 |
stl_off | STL支持被禁用。默认情况下,使用编译器默认值。 |
thread | 线程支持已启用。当CONFIG包含默认的qt时,这是启用的。 |
c++11 | C++11支持已启用。如果编译器不支持C++11,则此选项不起作用。默认情况下,支持被禁用。 |
c++14 | C++14支持已启用。如果编译器不支持C ++ 14,则此选项无效。默认情况下,支持被禁用。 |
depend_includepath | 将INCLUDEPATH的值附加到DEPENDPATH已启用。默认设置。 |
当您使用debug_and_release
选项(这是Windows下的默认选项)时,项目将被处理三次:一次产生一个”meta”的Makefile
,另外两次产生一个Makefile.Debug
和一个Makefile.Release
。
在后面的过程中,build_pass
和相应的调试或释放选项被添加到CONFIG
。这使得执行特定于构建的任务成为可能。例如:
build_pass:CONFIG(debug, debug|release) {
unix: TARGET = $$join(TARGET,,,_debug)
else: TARGET = $$join(TARGET,,,d)
}
作为手动编写构建类型条件的替代方法,某些变量提供特定于构建的变体,例如QMAKE_LFLAGS_RELEASE
和通用QMAKE_LFLAGS
。这些应该在可用时使用。
元Makefile使得子构建可以通过debug和release目标进行调用,并通过全部目标进行组合构建。当使用build_all
CONFIG
选项时,组合构建是默认的。否则,set(debug,release)
中最后指定的CONFIG
选项将确定默认值。在这种情况下,您可以明确地调用全部目标来同时构建两个配置:
make all
注意:生成Visual Studio和Xcode项目时的细节略有不同。
当链接一个库时,qmake
依靠底层平台来知道这个库链接的其他库。但是,如果静态链接,除非我们使用下面的CONFIG
选项,否则qmake
将不会得到这个信息:
选项 | 描述 |
---|---|
create_prl | 这个选项使qmake能够跟踪这些依赖关系。启用此选项后,qmake将创建一个扩展名为.prl的文件,该文件将保存有关该库的元信息(请参阅库依赖关系了解更多信息)。 |
link_prl | 启用此选项后,qmake将处理由应用程序链接的所有库,并查找其元信息(请参阅库依赖关系以获取更多信息)。 |
注:构建静态库时需要create_prl
选项,而使用静态库时需要link_prl
。
以下选项定义应用程序或库类型:
选项 | 描述 |
---|---|
qt | 目标是一个Qt应用程序或库,需要Qt库和头文件。 Qt库的正确包含和库路径将自动添加到项目中。这是默认定义的,可以使用\ l {#qt} {QT}变量进行微调。 |
x11 | 目标是X11应用程序或库。正确的包含路径和库将自动添加到项目中。 |
testcase | 目标是一个自动化测试。检查目标将被添加到生成的Makefile来运行测试。只有在生成Makefiles时才有意义。 |
insignificant_test | 自动测试的退出代码将被忽略。只有在测试用例也被设置的情况下。 |
windows | 目标是一个Win32窗口应用程序(仅适用于应用程序)。合适的包含路径,编译器标志和库将自动添加到项目中。 |
console | 目标是一个Win32控制台应用程序(仅适用于应用程序)。合适的包含路径,编译器标志和库将自动添加到项目中。 |
shared dll | 目标是一个共享对象/ DLL。合适的包含路径,编译器标志和库将自动添加到项目中。请注意,DLL也可以在所有平台上使用;将为目标平台(.dll或.so)创建具有适当后缀的共享库文件。 |
static staticlib | 目标是一个静态库(仅限lib)。正确的编译器标志将自动添加到项目中。 |
plugin | 目标是一个插件(仅限lib)。这也使得DLL。 |
designer | 目标是Qt Designer的一个插件。 |
no_lflags_merge | 确保存储在LIBS变量中的库列表在使用之前不会被缩减为唯一值列表。 |
这些选项仅在Windows上定义了特定功能:
选项 | 描述 |
---|---|
flat | 当使用vcapp模板时,这将把所有的源文件放到源组和头文件中,而不管它们驻留在哪个目录中。关闭这个选项会根据目录对源/头组中的文件进行分组他们居住。这是默认打开的。 |
embed_manifest_dll | 将清单文件嵌入到作为库项目的一部分创建的DLL中。 |
embed_manifest_exe | 在作为应用程序项目的一部分创建的EXE中嵌入清单文件。 |
有关嵌入清单文件的选项的更多信息,请参阅平台注释。
以下选项只对macOS
有效:
选项 | 描述 |
---|---|
app_bundle | 将可执行文件放入一个包(这是默认的)。 |
lib_bundle | 把库放到一个库包中。 |
捆绑的构建过程也受到QMAKE_BUNDLE_DATA
变量内容的影响。
以下选项仅在Linux/Unix平台上有效:
选项 | 描述 |
---|---|
largefile | 包括对大文件的支持。 |
separate_debug_info | 将库的调试信息放在单独的文件中。 |
CONFIG
变量在解析范围时也会被检查。你可以分配任何东西给这个变量。
例如:
CONFIG += console newstuff
...
newstuff {
SOURCES += new.cpp
HEADERS += new.h
}
qmake
将此变量的值作为编译器C预处理器宏(-D选项)添加。
例如:
DEFINES += USE_MY_STUFF
注意:使用应用程序模板时,此变量仅在Windows上使用。
指定要包含在项目中的.def
文件。
指定要查找以解决依赖关系的所有目录的列表。在通过包含文件进行爬网时使用此变量。
指定目标文件的放置位置。
例如:
DESTDIR = ../../lib
指定要包含在dist目标中的文件列表。 UnixMake规范仅支持此功能。
例如:
DISTFILES += ../program.txt
注意:此变量仅适用于Windows目标。
指定在哪里复制目标dll。
指定UI文件(请参阅Qt Designer手册)在编译之前由uic处理。构建这些UI文件所需的所有依赖项,头文件和源文件将自动添加到项目中。
例如:
FORMS = mydialog.ui \
mywidget.ui \
myconfig.ui
指定在.vcproj
文件中设置的GUID
。 GUID
通常是随机确定的。但是,如果您需要固定的GUID
,则可以使用此变量进行设置。
这个变量只针对.vcproj
文件。否则将被忽略。
定义项目的头文件。 qmake
自动检测头文件中的类是否需要moc
,并将相应的依赖项和文件添加到项目中以生成和链接moc
文件。
例如:
HEADERS = myclass.h \
login.h \
mainwindow.h
此变量仅在Mac OS上用于设置应用程序图标。请参阅 the application icon documentation 以获取更多信息。
此变量仅在Visual Studio项目生成的Windows上用于将指定的文件放入#include
文件夹中。
指定在编译项目时应该搜索的#include
目录。
例如:
INCLUDEPATH = c:/msdev/include d:/stl/include
要指定包含空格的路径,请使用空白中描述的技术引用路径。
win32:INCLUDEPATH += "C:/mylibs/extra headers"
unix:INCLUDEPATH += "/home/user/extra headers"
指定执行make install
或类似安装过程时将要安装的资源列表。列表中的每个项目通常使用提供有关安装位置的信息的属性进行定义。
例如,以下target.path
定义将描述构建目标的安装位置,INSTALLS
赋值将构建目标添加到要安装的现有资源列表中:
target.path += $$[QT_INSTALL_PLUGINS]/imageformats
INSTALLS += target
有关更多信息,请参阅Installing Files。
这个变量也用来指定哪些附加文件将被部署到嵌入式设备。
指定Lex
文件的列表。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定中间Lex
对象文件的名称。该变量的值通常由qmake
处理,很少需要修改。
指定Lex
源文件的列表。所有依赖项,头文件和源文件将自动添加到项目中以构建这些lex
文件。
例如:
LEXSOURCES = lexer.l
指定要链接到项目中的库的列表。如果使用Unix -l
(库)和-L
(库路径)标志,则qmake
将在Windows
上正确处理库(也就是将库的完整路径传递给链接器)。该库必须为qmake而存在以查找-l lib
所在的目录。
例如:
unix:LIBS += -L/usr/local/lib -lmath
win32:LIBS += c:/mylibs/math.lib
要指定包含空格的路径,请使用空白中描述的技术引用路径。
win32:LIBS += "C:/mylibs/extra libs/extra.lib"
unix:LIBS += "-L/home/user/extra libs" -lextra
默认情况下,存储在LIBS
中的库列表在使用之前被缩减为唯一名称列表。要改变这种行为,将no_lflags_merge
选项添加到CONFIG
变量中:
CONFIG += no_lflags_merge
只要在变量声明中需要一个文字哈希字符(#
),就可以使用这个变量,可能作为文件名的一部分或传递给某个外部应用程序的字符串。
例如:
# To include a literal hash character, use the $$LITERAL_HASH variable:
urlPieces = http://doc.qt.io/qt-5/qtextdocument.html pageCount
message($$join(urlPieces, $$LITERAL_HASH))
通过以这种方式使用LITERAL_HASH
,可以使用#
字符构造message()
函数的URL以便打印到控制台。
指定生成的Makefile
的名称。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定生成Makefile
时使用的Makefile
生成器的名称。这个变量的值通常由qmake
内部处理,很少需要修改。
这些变量由qmake
内部处理,不应该被修改或利用。
指定应放置所有中间moc
文件的目录。
例如:
unix:MOC_DIR = ../myproject/tmp
win32:MOC_DIR = c:/myproject/tmp
这个变量是从SOURCES
变量自动填充的。每个源文件的扩展名都被替换为.o
(Unix)或.obj
(Win32)。您可以将对象添加到列表中。
指定应放置所有中间对象的目录。
例如:
unix:OBJECTS_DIR = ../myproject/tmp
win32:OBJECTS_DIR = c:/myproject/tmp
列出目标所依赖的库。一些后端(如Visual Studio和Xcode项目文件的生成器)不支持此变量。一般来说,这个变量是由这些构建工具在内部支持的,而且对于显式列出依赖的静态库非常有用。
该列表放置在所有内建(和$PRE_TARGETDEPS
)依赖关系之后。
列出目标所依赖的库。一些后端(如Visual Studio和Xcode项目文件的生成器)不支持此变量。一般来说,这个变量是由这些构建工具在内部支持的,而且对于显式列出依赖的静态库非常有用。
这个列表放置在所有的内建依赖项之前。
指示用于创建预编译头文件的头文件,以提高项目的编译速度。预编译头文件目前仅在某些平台上支持(Windows - 所有MSVC项目
类型,Apple - Xcode,Makefile,Unix - gcc 3.3及更高版本)。
指定指向包含当前正在分析的文件的目录的完整路径。编写项目文件以支持阴影构建时,这可能有助于在源代码树中引用文件。
另请参阅_PRO_FILE_PWD_
。
注意:不要试图覆盖这个变量的值。
指定通往qmake
放置生成的Makefile
的目录的完整路径。
注意:不要试图覆盖这个变量的值。
指定qmake
程序本身的名称,并放置在生成的Makefiles
中。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
包含生成Makefiles
时使用的qmake
配置的完整路径的系统变量。这个变量的值是自动计算的。
注意:不要试图覆盖这个变量的值。
注意:这个变量只在Unix平台上使用。
指定创建共享库时要执行的命令。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
注意:此变量仅用于macOS,iOS,tvOS和watchOS。
指定将与库包一起安装的数据,通常用于指定头文件的集合。
例如,以下行将path/to/header_one.h
和path/to/header_two.h
添加到包含框架提供的头信息的组中:
FRAMEWORK_HEADERS.version = Versions
FRAMEWORK_HEADERS.files = path/to/header_one.h path/to/header_two.h
FRAMEWORK_HEADERS.path = Headers
QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS
最后一行将关于标题的信息添加到将与库软件包一起安装的资源的集合中。
当lib_bundle
选项被添加到CONFIG
变量时,会创建库包。
有关创建库包的更多信息,请参阅平台注释。
注意:此变量仅用于macOS,iOS,tvOS和watchOS。
指定要用于库包的扩展。这允许使用自定义扩展而不是标准的.framework
目录名称扩展来创建框架。
例如,下面的定义将导致一个带有.myframework扩展的框架:
QMAKE_BUNDLE_EXTENSION = .myframework
指定构建包含C源代码的项目时将使用的C编译器。只要编译器可执行文件的文件名需要指定,只要它在处理Makefile
时位于PATH
变量中包含的路径上即可。
指定用于构建项目的C编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。特定于调试和释放模式的标志可以通过分别修改QMAKE_CFLAGS_DEBUG
和QMAKE_CFLAGS_RELEASE
变量进行调整。
指定调试版本的C编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定发布版本的C编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
注意:这个变量只在Unix平台上使用。
指定用于创建共享库的编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定用于创建多线程应用程序的编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
该变量仅在设置了warn_off
CONFIG
选项时使用。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
该变量仅在设置了warn_on
CONFIG
选项时使用。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定生成的文件列表(例如moc
和uic
)以及make clean
要删除的目标文件。
指定构建包含C++源代码的项目时将使用的C++编译器。只要编译器可执行文件的文件名需要指定,只要它在处理Makefile
时位于PATH
变量中包含的路径上即可。
指定用于构建项目的C++编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。特定于调试和发布模式的标志可以通过分别修改QMAKE_CXXFLAGS_DEBUG
和QMAKE_CXXFLAGS_RELEASE
变量进行调整。
指定调试版本的C++编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定发布版本的C++编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定用于创建共享库的C++编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定用于创建多线程应用程序的C++编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定用于抑制编译器警告的C++编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定用于生成编译器警告的C++编译器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
注意:此变量仅用于macOS,iOS,tvOS和watchOS。
用于签署证书和配置文件的开发小组的标识符。
指定通过make distclean
删除的文件列表。
包含共享库的扩展。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
注意:更改扩展名的特定于平台的变量会覆盖此变量的内容。
包含共享静态库的扩展。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
包含在包含的moc
文件上使用的扩展名。
另请参阅文件扩展名。
包含在Qt Designer UI文件上使用的扩展。
另请参阅文件扩展名。
包含在创建的PRL
文件上使用的扩展名。
另请参阅文件扩展名,库依赖关系。
包含给予Lex
的文件的扩展名。
另请参阅文件扩展名,LEXSOURCES
。
包含给予Yacc
的文件的扩展名。
另请参阅文件扩展名YACCSOURCES
。
包含在生成的对象文件上使用的扩展名。
另请参阅文件扩展名。
包含应解释为C ++源代码的文件的后缀。
另请参阅文件扩展名。
包含应被解释为C头文件的文件的后缀。
另请参阅文件扩展名。
指定其他编译器或预处理器的列表。
另请参阅添加编译器。
指定其他qmake
目标的列表。
另请参阅添加自定义目标。
包含失败的需求列表。这个变量的值由qmake
设置,不能修改。
另请参阅require()
和REQUIRES
。
注意:此变量仅用于macOS,iOS,tvOS和watchOS。
在框架项目中,此变量包含要构建的框架使用的名称。
默认情况下,该变量包含与TARGET
变量相同的值。
有关创建框架和库包的更多信息,请参阅创建框架。
注意:此变量仅用于macOS,iOS,tvOS和watchOS。
对于构建目标是macOS,iOS,tvOS或watchOS框架的项目,此变量用于指定将应用于构建的框架的版本号。
默认情况下,该变量包含与VERSION
变量相同的值。
有关创建框架的更多信息,请参阅创建框架。
提供有关运行qmake
的主机的信息。例如,您可以从QMAKE_HOST.arch
中检索主机架构。
Keys | Values |
---|---|
.arch | 主机架构 |
.os | 主机操作系统 |
.cpu_count | 可用的cpus数量 |
.name | 主机名称 |
.version | 主机操作系统版本号 |
.version_string | 主机OS版本字符串 |
win32-g++:contains(QMAKE_HOST.arch, x86_64):{
message("Host is 64bit")
...
}
指定附加到INCLUDEPATH
的系统标题路径的列表。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定在使用OpenGL/ES
或OpenVG
支持构建目标时要添加到INCLUDEPATH
的EGL
头文件的位置。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定在构建具有OpenGL
支持的目标时要添加到INCLUDEPATH
的OpenGL
头文件的位置。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
如果OpenGL
实现使用EGL
(大多数OpenGL/ES
系统),那么也可能需要设置QMAKE_INCDIR_EGL
。
当使用OpenGLES2
支持构建目标时,此变量指定要添加到INCLUDEPATH
的OpenGL
头文件的位置。
这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
如果OpenGL
实现使用EGL
(大多数OpenGL/ES
系统),那么也可能需要设置QMAKE_INCDIR_EGL
。
指定OpenVG
头文件在创建OpenVG
支持目标时添加到INCLUDEPATH
的位置。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
如果OpenVG
实现使用EGL
,则可能还需要设置QMAKE_INCDIR_EGL
。
注意:这个变量只在Unix平台上使用。
指定在构建X11
目标时要添加到INCLUDEPATH
的X11
头文件路径的位置。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
注意:此变量仅用于macOS,iOS,tvOS和watchOS平台。
指定要包含在macOS,iOS,tvOS和watchOS应用程序包中的属性列表文件.plist
的名称。
在.plist
文件中,可以定义一些变量,例如@ EXECUTABLE @
,qmake
将用实际的可执行文件名替换。其他变量包括@ ICON @
,@ TYPEINFO @
,@ LIBRARY @
和@ SHORT_VERSION @
。
如果为iOS
构建,并且.plist
文件包含关键的NSPhotoLibraryUsageDescription,则qmake
将在该构建中增加一个额外的插件,以增加照片访问支持(例如对于QFile/QFileDialog
)。有关此密钥的更多信息,请参阅Apple的Info.plist文档。
注意:大多数情况下,Info.plist默认是足够好的。
注意:此变量仅在iOS平台上使用。
指定应用程序支持的最低版本的iOS。
有关更多信息,请参阅表达支持的iOS版本。
指定传递给链接器的一组通用标志。如果您需要更改用于特定平台或项目类型的标志,请使用其中一个专用变量来代替此变量。
注意:此变量仅在Windows上使用。
指定构建控制台程序的链接器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定调试版本的链接器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定构建插件的链接器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
注意:这个变量只在Unix平台上使用。
指定使用来自QMAKE_RPATHDIR
的值所需的链接器标志。
这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定在QMAKE_RPATHDIR
中启用相对路径所需的链接器标志。
这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定动态链接器理解为引用可执行文件或库的位置的字符串。
这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定使用来自QMAKE_RPATHLINKDIR
的值所需的链接器标志。
这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定发布版本的链接器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定构建应用程序的链接器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定用于构建共享库的链接器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定用于设置共享对象(例如.so
或.dll
)的名称的链接器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定用于构建多线程项目的链接器标志。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
注意:此变量仅在Windows上使用。
指定用于构建Windows GUI项目的链接器标志(即非控制台应用程序)。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定系统库路径的列表。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
注意:这个变量只在Unix平台上使用。
使用-L
前缀指定所有库目录的位置。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定EGL
与OpenGL/ES
或OpenVG
一起使用时EGL
库目录的位置。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定OpenGL
库目录的位置。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
如果OpenGL
实现使用EGL
(大多数OpenGL/ES
系统),那么也可能需要设置QMAKE_LIBDIR_EGL
。
指定OpenVG
库目录的位置。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
如果OpenVG
实现使用EGL
,那么也可能需要设置QMAKE_LIBDIR_EGL
。
注意:这个变量只在Unix平台上使用。
指定X11
库目录的位置。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定所有项目库。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
在使用OpenGL/ES
或OpenVG
构建Qt时指定所有的EGL
库。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。通常的值是-lEGL
。
指定所有OpenGL
库。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
如果OpenGL
实现使用EGL
(大多数OpenGL/ES
系统),那么也可能需要设置QMAKE_LIBS_EGL
。
QMAKE_LIBS_OPENGL_ES1
,QMAKE_LIBS_OPENGL_ES2
这些变量指定了OpenGL ES 1
和OpenGL ES 2
的所有OpenGL
库。
这些变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
如果OpenGL
实现使用EGL
(大多数OpenGL / ES
系统),那么也可能需要设置QMAKE_LIBS_EGL
。
指定所有的OpenVG
库。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。通常的值是-lOpenVG
。
一些OpenVG
引擎是在OpenGL
之上实现的。这将在配置时检测到,QMAKE_LIBS_OPENGL
将隐式添加到QMAKE_LIBS_OPENVG
,无论OpenVG
库链接在哪里。
如果OpenVG
实现使用EGL
,那么也可能需要设置QMAKE_LIBS_EGL
。
注意:这个变量只在Unix平台上使用。
指定构建多线程目标时需要链接的所有库。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。
注意:这个变量只在Unix平台上使用。
指定所有X11
库。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
如果指定了lib
模板,则该变量不为空。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定构建基于应用程序的项目时将使用的链接器。只有链接器可执行文件的文件名需要指定,只要它在处理Makefile
时位于PATH
变量中包含的路径上即可。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定创建共享库时要执行的命令。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定创建指向共享库的链接时执行的命令。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定用于构建项目的Objective C/C++
编译器标志。除了QMAKE_CFLAGS
和QMAKE_CXXFLAGS
之外,还使用这些标志。
指定将TARGET
链接在一起后执行的命令。这个变量通常是空的,因此没有任何执行。
注意:这个变量对Xcode
项目不起作用。
指定将TARGET
链接在一起之前执行的命令。这个变量通常是空的,因此没有任何执行。
注意:这个变量对Xcode
项目不起作用。
注意:此变量仅用于Visual Studio项目文件。
为IDE生成项目文件时,确定项目的名称。默认值是目标名称。这个变量的值通常由qmake
处理,很少需要修改。
注意:此变量仅用于macOS,iOS,tvOS和watchOS。
有效的配置文件的UUID
。与QMAKE_DEVELOPMENT_TEAM
一起使用来指定供应配置文件。
注意:指定供应配置文件会禁用自动管理的签名。
构建通用二进制文件时,此变量在macOS上使用。
注意:此变量仅在macOS平台上使用。
指定应用程序支持的最低硬件版本。
有关更多信息,请参阅macOS版本依赖关系。
指定要创建的Makefile
的名称。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
包含qmake
可执行文件的abosolute
路径。
注意:不要试图覆盖这个变量的值。
此变量用于在使用它的每个构建规则中自定义传递给资源编译器的选项列表。例如,以下行确保每次调用rcc
时使用-threshold
和-compress
选项以及特定的值:
QMAKE_RESOURCE_FLAGS += -threshold 0 -compress 9
注意:这个变量只在Unix平台上使用。
指定链接时添加到可执行文件的库路径列表,以便在运行时优先搜索路径。
当指定相对路径时,qmake
将把它们转换成动态链接器所理解的形式,以相对于引用的可执行文件或库的位置。这仅受某些平台(目前基于Linux和Darwin的平台)的支持,可通过检查是否设置QMAKE_REL_RPATH_BASE
来检测。
指定静态链接程序的库路径列表,以搜索共享库的隐式依赖关系。有关更多信息,请参阅ld(1)的手册页。
指定构建对象所需的单个规则。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定构建对象所需的单个规则。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定构建对象所需的单个规则。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定构建对象所需的单个规则。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
如果已定义,则将此变量的值用作要构建的共享库的SONAME
标识符的前缀。 SONAME
是动态连接器稍后将用于引用库的标识符。通常这个参考可以是一个库名或完整的库路径。在macOS,iOS,tvOS和watchOS上,可以使用以下占位符相对地指定路径:
占位符 | 影响 |
---|---|
@rpath | 扩展到由当前进程可执行文件或引用库中的LC_RPATH mach-o命令定义的路径。 |
@executable_path | 扩展到当前进程的可执行位置。 |
@loader_path | 扩展到引用的可执行文件或库位置。 |
在大多数情况下,使用@rpath就足够了,建议:
# /project.pro
QMAKE_SONAME_PREFIX = @rpath
但是,也可以使用不同的占位符或绝对路径来指定前缀,例如以下之一:
# /project.pro
QMAKE_SONAME_PREFIX = @executable_path/../Frameworks
QMAKE_SONAME_PREFIX = @loader_path/Frameworks
QMAKE_SONAME_PREFIX = /Library/Frameworks
有关更多信息,请参阅动态库安装名称上的dyld文档。
指定项目目标的名称。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
仅限Windows。指定项目目标的公司;这适用于将公司名称放在应用程序的属性中。这只有在VERSION
或RC_ICONS
变量被设置并且RC_FILE
和RES_FILE
变量没有被设置时才被使用。
仅限Windows。指定项目目标的描述;这适用于在应用程序的属性中描述的情况。这只有在VERSION
或RC_ICONS
变量被设置并且RC_FILE
和RES_FILE
变量没有被设置时才被使用。
仅限Windows。指定项目目标的版权信息;这适用于将版权信息放入应用程序的属性中。这只有在VERSION
或RC_ICONS
变量被设置并且RC_FILE
和RES_FILE
变量没有被设置时才被使用。
仅限Windows。指定项目目标的产品;这适用于将产品放入应用程序的属性中。这只有在VERSION
或RC_ICONS
变量被设置并且RC_FILE
和RES_FILE
变量没有被设置时才被使用。
注意:此变量仅在tvOS平台上使用。
指定应用程序支持的tvOS的最低硬件版本。
有关更多信息,请参阅表达支持的iOS版本。
注意:此变量仅用于watchOS平台。
指定应用程序支持的最低版本的watchOS。
有关更多信息,请参阅表达支持的iOS版本。
指定您的项目使用的Qt模块。有关为每个模块添加的值,请参阅模块文档。
默认情况下,QT包含core
和gui
,确保可以在不进行进一步配置的情况下构建标准GUI应用程序。
如果你想建立一个没有Qt GUI模块的项目,你需要用"-="
运算符来排除gui
值。下面的代码会产生一个最小的Qt项目:
QT -= gui # Only the core module is used.
如果您的项目是一个Qt Designer插件,请使用uiplugin值来指定该项目将被构建为一个库,但是具有对Qt Designer的特定插件支持。有关更多信息,请参阅构建和安装插件。
指定要与应用程序链接的静态Qt插件的名称列表,以使它们作为内置资源可用。
qmake
自动添加通常使用的Qt模块所需的插件(参见QT)。默认设置可以调整为最佳的开箱即用体验。有关可用插件的列表,请参阅静态插件,以及覆盖自动链接的方法。
当链接到Qt的共享/动态构建或链接库时,此变量当前不起作用。它可能用于稍后部署动态插件。
包含当前版本的Qt。
包含当前主要版本的Qt。
包含当前的Qt小版本。
包含Qt的当前补丁版本。
指定应用程序的资源文件的名称。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
仅限Windows。指定应在生成的.rc
文件中指定的代码页。这只有在VERSION
或RC_ICONS
变量被设置并且RC_FILE
和RES_FILE
变量没有被设置时才被使用。
仅限Windows。 qmake
将此变量的值作为RC
预处理器宏(/d选项)添加。如果未设置此变量,则使用DEFINES
变量。
RC_DEFINES += USE_MY_STUFF
仅限Windows。指定应包含在生成的.rc
文件中的图标。这只有在RC_FILE
和RES_FILE
变量没有被设置的情况下才被使用。有关.rc
文件生成的更多细节可以在Platform Notes中找到。
仅限Windows。指定应在生成的.rc
文件中指定的语言。这只有在VERSION
或RC_ICONS
变量被设置并且RC_FILE
和RES_FILE
变量没有被设置时才被使用。
指定传递给Windows资源编译器的包含路径。
指定Qt资源编译器输出文件的目录。
例如:
unix:RCC_DIR = ../myproject/resources
win32:RCC_DIR = c:/myproject/resources
指定作为条件评估的值列表。如果任何一个条件是错误的,qmake
在构建时跳过这个项目(及其SUBDIRS
)。
注意:如果您想在构建时跳过项目或子项目,我们建议使用require()
函数。
指定目标的资源集合文件(qrc
)的名称。有关资源收集文件的更多信息,请参阅Qt资源系统。
指定目标的已编译Windows
资源文件的名称。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
来源
指定项目中所有源文件的名称。
例如:
SOURCES = myclass.cpp \
login.cpp \
mainwindow.cpp
此变量与子模板一起使用时,指定包含需要构建的项目部分的所有子目录或项目文件的名称。使用此变量指定的每个子目录都必须包含自己的项目文件。
建议每个子目录中的项目文件具有与子目录本身相同的基本名称,因为这样可以省略文件名称。例如,如果该子目录名为myapp,则该目录中的项目文件应称为myapp.pro。
或者,您可以指定任何目录中的.pro文件的相对路径。强烈建议您只在当前项目的父目录或其子目录中指定路径。
例如:
SUBDIRS = kernel \
tools \
myapp
如果您需要确保子目录按照指定的顺序构建,请更新CONFIG
变量以包含已排序的选项:
CONFIG += ordered
可以通过给SUBDIRS
元素提供额外的修饰符来修改SUBDIRS
的默认行为。支持的修饰符是:
修改 | 影响 |
---|---|
.subdir | 使用指定的子目录而不是SUBDIRS值。 |
.file | 明确指定子项目专业文件。不能与.subdir修饰符一起使用。 |
.depends | 这个子项目依赖于指定的子项目。 |
.makefile | 子项目的makefile。仅在使用makefile的平台上可用。 |
.target | 用于与此子项目相关的makefile目标的基本字符串。仅在使用makefile的平台上可用。 |
例如,定义两个子目录,这两个子目录都位于与SUBDIRS
值不同的目录中,而其中一个子目录必须先建立在另一个之前:
SUBDIRS += my_executable my_library
my_executable.subdir = app
my_executable.depends = my_library
my_library.subdir = lib
TARGET
指定目标文件的名称。包含默认项目文件的基本名称。
例如:
TEMPLATE = app
TARGET = myapp
SOURCES = main.cpp
上面的项目文件会在Windows上产生一个名为myapp
的可执行文件,在UNIX上是myapp.exe。
指定TARGET
的扩展名。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定具有主要版本号的TARGET
的扩展名。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
用版本号指定TARGET
的扩展名。这个变量的值通常由qmake
或qmake.conf
处理,很少需要修改。
指定生成项目时要使用的模板的名称。允许的值是:
选项 | 描述 |
---|---|
app | 为构建应用程序创建一个Makefile(默认)。有关更多信息,请参阅构建应用程序 |
lib | 为构建库创建一个Makefile。有关更多信息,请参阅建立图书馆。 |
subdirs | 创建一个用于在子目录中构建目标的Makefile。子目录是使用SUBDIRS变量指定的。 |
aux | 创建一个Makefile,不建造任何东西。如果不需要调用编译器来创建目标,请使用此方法,例如因为您的项目是使用解释型语言编写的。注意:此模板类型仅适用于基于Makefile的生成器。特别是,它不会与vcxproj和Xcode生成器一起工作。 |
vcapp | 仅限Windows。为Visual Studio创建一个应用程序项目。有关更多信息,请参阅创建Visual Studio项目文件。 |
vclib | 仅限Windows。为Visual Studio创建一个库项目。 |
例如:
TEMPLATE = lib
SOURCES = main.cpp
TARGET = mylib
通过使用-t
命令行选项指定新的模板类型,可以覆盖该模板。在.pro
文件处理完成后,这将覆盖模板类型。对于使用模板类型来确定项目构建方式的.pro
文件,有必要在命令行上声明TEMPLATE
而不是使用-t
选项。
指定包含用户界面文本翻译成非本地语言的翻译(.ts
)文件的列表。
有关Qt的国际化(i18n
)和本地化(l10n
)的更多信息,请参阅Qt语言学手册。
指定来自uic的所有中间文件应放置的目录。
例如:
unix:UI_DIR = ../myproject/ui
win32:UI_DIR = c:/myproject/ui
如果指定了应用程序模板,则指定应用程序的版本号,如果指定了lib
模板,则指定该库的版本号。
在Windows上,如果未设置RC_FILE
和RES_FILE
变量,则会触发自动生成.rc
文件。生成的.rc
文件将包含FILEVERSION
和PRODUCTVERSION
条目,其中包含主要,次要,修补程序级别和内部版本号。每个数字必须在0到65535的范围内。有关.rc
文件生成的更多细节可以在Platform Notes中找到。
例如:
win32:VERSION = 1.2.3.4 # major.minor.patch.build
else:VERSION = 1.2.3 # major.minor.patch
仅限Windows。指定Windows链接程序通过/VERSION
选项将其放入.exe
或.dll
文件的标头中的版本号。只能指定主要和次要版本。如果未设置VERSION_PE_HEADER
,则会从VERSION
(如果已设置)回退到主版本和次版本。
VERSION_PE_HEADER = 1.2
如果指定了lib
模板,则指定库的主要版本号。
如果指定了lib
模板,则指定该库的次要版本号。
如果指定了lib
模板,则指定库的补丁版本号。
告诉qmake
在哪里搜索无法打开的文件。例如,如果qmake
查找SOURCES
并找到无法打开的条目,则查看整个VPATH
列表以查看它是否可以自行查找该文件。
另请参阅DEPENDPATH
。
指定要在Windows运行时传递给应用程序清单的参数。允许的值是:
成员 | 描述 |
---|---|
architecture | 目标架构。默认为VCPROJ_ARCH。 |
background | 平铺背景颜色。默认为绿色。 |
capabilities | 指定添加到能力列表的功能。 |
capabilities_device | 指定要添加到功能列表(位置,网络摄像机等)的设备功能。 |
CONFIG | 指定用于处理输入清单文件的附加标志。目前,逐字是唯一可用的选项。 |
default_language | 应用程序的默认语言代码。默认为“en”。 |
dependencies | 指定包所需的依赖关系。 |
description | 包描述。默认为默认包描述。 |
foreground | 平铺前景(文本)颜色。默认为亮。此选项仅适用于Windows 8和Windows RT上的Windows应用商店应用。 |
iconic_tile_ico | 图标文件的标志性瓷砖模板图标。默认由mkspec提供。 |
iconic_tile_small | 图标文件的小标志性瓷砖模板标志。默认由mkspec提供。 |
identity | 应用程序的唯一ID。默认是重用现有的生成清单的UUID,或者如果没有任何存在的话生成一个新的UUID。 |
logo_30x30 | 标志图像文件的大小30x30像素。这在Windows Phone上不受支持。 |
logo_41x41 | 标志图像文件的大小41×41像素。这仅在Windows Phone上受支持。 |
logo_70x70 | 标志图像文件的大小70x70像素。这在Windows Phone上不受支持。 |
logo_71x71 | 标志图像文件的大小71x71像素。这仅在Windows Phone上受支持。 |
logo_150x150 | 标志图像文件的大小为150x150像素。这在所有Windows应用商店应用平台上都受支持。 |
logo_310x150 | 标志图像文件的大小为310x150像素。这在所有Windows应用商店应用平台上都受支持。 |
logo_310x310 | 标志图像文件的大小为310x310像素。这在所有Windows应用商店应用平台上都受支持。 |
logo_620x300 | 初始屏幕图像文件的大小为620x300像素。这在Windows Phone上不受支持。 |
logo_480x800 | 标志图像文件的大小为480x800像素。这仅在Windows Phone上受支持。 |
logo_large | 标志图像文件。这必须是150x150像素。在所有Windows应用商店应用平台上受支持默认由mkspec提供。 |
logo_medium | 中等标志图像文件。对于Windows Phone,图像的像素大小必须为71x71,对于其他Windows应用商店应用平台70x70。默认由mkspec提供。 |
logo_small | 小徽标图像文件。对于Windows Phone,对于其他Windows应用商店应用平台30x30,图像的像素大小必须为44x44。默认由mkspec提供。 |
logo_splash | 初始屏幕图像文件。对于Windows Phone,图像的像素大小必须为480x800,对于其他Windows应用商店应用平台620x300。默认由mkspec提供。 |
logo_store | Windows商店的徽标图像文件。默认由mkspec提供。 |
logo_wide | 宽的标志图像文件。这必须是310x150像素。在所有Windows应用商店应用平台上受支持默认由mkspec提供。 |
name | 显示给用户的包的名称。默认为TARGET。 |
phone_product_id | 产品的GUID。缺省值为WINRT_MANIFEST.identity的值。(仅适用于Windows Phone) |
phone_publisher_id | 发布者的GUID。默认为一个无效的GUID。 (仅适用于Windows Phone) |
publisher | 显示发布者的名称。默认为默认发布者显示名称。 |
publisher_id | 发布者的专有名称(默认:CN = MyCN)。 |
target | 目标的名称(.exe)。默认为TARGET。 |
version | 包的版本号。默认为1.0.0.0。 |
minVersion | 运行该软件包所需的最低Windows版本。缺省为环境变量UCRTVersion。 |
maxVersionTested | 该软件包已经过测试的最大Windows版本。默认为WINRT_MANIFEST.minVersion |
您可以使用这些值的任意组合。
例如:
WINRT_MANIFEST.publisher = MyCompany
WINRT_MANIFEST.logo_store = someImage.png
WINRT_MANIFEST.capabilities += internetClient
WINRT_MANIFEST.capabilities_device += location
另外,可以使用WINRT_MANIFEST
指定输入清单文件。
例如:
WINRT_MANIFEST = someManifest.xml.in
如果输入的清单文件不能被处理,只能拷贝到目标目录,那么需要设置逐字记录配置。
WINRT_MANIFEST = someManifest.xml.in
WINRT_MANIFEST.CONFIG += verbatim
注意:logo_small
,logo_medium
和logo_large
所需的图像大小取决于目标平台。如果提供了指定尺寸的描述,则一般描述将被覆盖。
指定要包含在项目中的Yacc
源文件的列表。 所有的依赖项,头文件和源文件将自动包含在项目中。
例如:
YACCSOURCES = moc.y
包含正在使用的项目文件的路径。
例如,下面的行将导致项目文件的位置写入控制台:
message($$_PRO_FILE_)
注意:不要试图覆盖这个变量的值。
包含包含正在使用的项目文件的目录的路径。
例如,以下行将导致包含项目文件的目录的位置写入控制台:
message($$_PRO_FILE_PWD_)
注意:不要试图覆盖这个变量的值。
qmake
提供了在配置过程中处理变量内容的函数。这些功能被称为替换功能。通常,它们返回可以分配给其他变量的值。您可以通过给$$
操作符添加一个前缀来获得这些值。替换函数可以分为内置函数和函数库。
另请参阅测试功能。
基本的替换函数被实现为内置函数。
返回路径的绝对路径。
如果未指定base,则使用当前目录作为基本目录。
例如,以下调用返回字符串“/home/johndoe/myproject/readme.txt”
:
message($$absolute_path("readme.txt","/home/johndoe/myproject"))
另请参阅clean_path()
,relative_path()
。
返回在变量名中指定的文件的基本名称。
例如:
FILE = /etc/passwd
FILENAME = $$basename(FILE) #passwd
返回文件名的内容。您可以为模式指定以下选项:
返回目录分隔符标准化(转换为“/”
)的路径,删除多余的目录分隔符,然后解析“.”
和“..”
(尽可能)。这个函数是QDir :: cleanPath
的一个包装。
另请参见absolute_path()
,relative_path()``,shell_path()
,system_path()
。
返回指定文件的目录名称部分。例如:
FILE = /etc/X11R6/XF86Config
DIRNAME = $$dirname(FILE) #/etc/X11R6
返回所有已定义变量名称的列表。
接受任意数量的参数。它为每个参数展开转义序列\n
,\r
,\t
并以列表形式返回参数。
注意:如果指定字符串进行字面扩展,则需要转义反斜杠,如下面的代码片段所示:
message("First line$$escape_expand(\\n)Second line")
返回与正则表达式substr
匹配的变量名中的所有值。
MY_VAR = one two three four
MY_VAR2 = $$join(MY_VAR, " -L", -L) -Lfive
MY_VAR3 = $$member(MY_VAR, 2) $$find(MY_VAR, t.*)
MY_VAR2
将包含’-Lone -Ltwo -Lthree -Lfour -Lfive
‘,MY_VAR3
将包含’three two three
‘。
扩展指定的通配符模式并返回文件名列表。如果递归是真的,这个函数下降到子目录。
返回variablename
的第一个值。
例如,以下调用返回firstname
:
CONTACT = firstname middlename surname phone
message($$first(CONTACT))
另请参阅take_first()
,last()
。
以选项指定的格式返回数字。您可以指定以下选项:
目前不支持浮点数。
例如,以下调用将十六进制数字BAD转换为002989:
message($$format_number(BAD, ibase=16 width=6 zeropad))
评估文件名为一个qmake
项目文件,并返回分配给variablename
的值。
另请参见infile()
。
返回环境变量variablename
的值。这大部分等价于$$(variablename)
语法。但是,getenv
函数支持名称中带有圆括号的环境变量。
连接加入变量名的值。如果这个值不是空的,这个函数在variablename添加前后缀值。 variablename
是唯一必需的字段,其他字符串默认为空字符串。如果你需要在glue中编码空格,之前或之后,你必须引用它。
返回variablename
的最后一个值。
例如,以下通话返回电话:
CONTACT = firstname middlename surname phone
message($$last(CONTACT))
另请参阅take_last()
,first()
。
采取任意数量。它创建一个唯一命名的变量,其中包含参数列表,并返回该变量的名称。您可以使用该变量来编写一个循环,如以下代码片段所示
for(var, $$list(foo bar baz)) {
...
}
代替:
values = foo bar baz
for(var, values) {
...
}
采取任意数量的参数并将其转换为小写。
另请参阅upper()
。
返回开始和结束(inclusive)之间从零开始的元素索引的变量名列表值的切片。
如果没有开始,它默认为零。这个用法相当于$$first(variablename)
。
如果没有给出结束,则默认开始。这个用法表示简单的数组索引,就像返回一个元素一样。
也可以在单个参数中指定开始和结束,数字用两个句点分隔。
负数表示从列表末尾开始的索引,-1
是最后一个元素。
如果任一索引超出范围,则返回空列表。
如果结束小于开始,元素将以相反的顺序返回。
注意:结束索引是包含性的和无序的这一事实意味着只有当索引是无效的(输入变量是空的)才会返回一个空列表。
另请参阅str_member()
。
采取任意数量的数字参数并将其相加,返回总和。
由于可以简单地将一个减号前置到一个数值来否定它,所以隐式支持减法:
sum = $$num_add($$first, -$$second)
如果操作数可能已经是负数,则需要另一个步骤来正常化数字:
second_neg = -$$second
second_neg ~= s/^--//
sum = $$num_add($$first, $$second_neg)
显示指定的问题,并返回从标准输入读取的值。
如果装饰是真的(默认),问题得到一个通用的前缀和后缀标识为提示。
将整个字符串转换为单个实体并返回结果。这只是将字符串括入双引号的一种奇特的方式。
返回带有反斜杠的特殊正则表达式字符的字符串。这个函数是QRegExp :: escape
的一个包装。
返回filePath
相对于base
的路径。如果没有指定base
,则是当前的项目目录。这个函数是QDir :: relativeFilePath
的一个封装。
另请参阅absolute_path()
,clean_path()
。
用作为字符串提供的变量内容中的new_string
替换old_string
的每个实例。例如,代码
MESSAGE = This is a tent.
message($$replace(MESSAGE, tent, test)
打印消息:
这是一个测试。
使用在逗号分隔的函数参数列表中传递的参数来替换%1-%9
,并返回已处理的字符串。
这是您通常不需要的内部函数。
以相反顺序返回variablename
的值。
返回variablename
的值的一部分。这个函数是QString :: section
的一个包装。
例如,以下呼叫输出姓:
CONTACT = firstname:middlename:surname:phone
message($$section(CONTACT, :, 2, 2))
将项目源目录中的路径映射到构建目录。此函数返回源内构建的路径。如果路径指向源树之外,它将返回一个空字符串。
将路径中的所有目录分隔符转换为与构建项目时使用的shell
(即,由make
工具调用的shell
)兼容的分隔符。例如,在使用Windows外壳程序时,斜杠会转换为反斜杠。
另请参阅system_path()
。
引用arg
用于构建项目时使用的shell
。
另请参阅system_quote()
。
返回变量名的值的数量。
另请参阅str_size|()
。
这是您通常不需要的内部函数。
返回变量名中的值列表,其中条目按照ASCII
升序排序。
数值排序可以通过在format_number()
函数的帮助下将值填充到固定长度来完成。
将variablename
的值拆分为不同的值,并将其作为列表返回。这个函数是QString :: split
的一个包装。
例如:
CONTACT = firstname:middlename:surname:phone
message($$split(CONTACT, :))
这个函数和member()
是一样的,不同的是它使用字符串值而不是列表变量,因此索引指向字符位置。
这个函数可以用来实现许多常见的字符串切片操作:
# $$left(VAR, len)
left = $$str_member(VAR, 0, $$num_add($$len, -1))
# $$right(VAR, len)
right = $$str_member(VAR, -$$num, -1)
# $$mid(VAR, off, len)
mid = $$str_member(VAR, $$off, $$num_add($$off, $$len, -1))
# $$mid(VAR, off)
mid = $$str_member(VAR, $$off, -1)
# $$reverse(VAR)
reverse = $$str_member(VAR, -1, 0)
注意:在这些实现中,一个零len参数需要单独处理。
另请参阅member()
,num_add()
。
返回参数中的字符数。
另请参阅size()
。
你可以使用这个系统函数的变体来从命令中获得stdout
,并把它分配给一个变量。
例如:
UNAME = $$system(uname -s)
contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me )
如果你传递stsvar
,命令的退出状态将被存储在该变量中。如果命令崩溃,状态将为-1
,否则为该命令选择的非负退出码。通常,将状态与零(成功)进行比较就足够了。
另请参阅system()
的测试版本。
将路径中的所有目录分隔符转换为与由system()
函数用来调用命令的shell
兼容的分隔符。例如,斜杠转换为Windows外壳的反斜杠。
另请参阅shell_path()
。
引用arg
表示由system()
函数使用的shell
。
另请参阅shell_quote()
。
返回variablename
的第一个值,并将其从源变量中移除。
例如,这为实现队列提供了便利。
另请参阅take_last()
,first()
。
返回variablename
的最后一个值,并将其从源变量中移除。
例如,这为实现堆栈提供了便利。
另请参阅take_first()
,last()
。
返回已删除重复条目的variablename
中的值列表。例如:
ARGS = 1 2 3 2 5 1
ARGS = $$unique(ARGS) #1 2 3 5
采取任意数量的参数并将其转换为大写。
另请参阅lower()
。
以一种能够将它们解析为qmake
代码的方式来转义variablename
的值。
测试函数返回一个布尔值,您可以在作用域的条件部分中进行测试。测试功能可以分为内置功能和功能库。
另请参阅替换功能。
基本测试功能是作为内置功能实现的。
这是您通常不需要的内部函数。
这个函数可以用来测试放置在CONFIG
变量中的变量。这与示波器相同,但具有可以传递第二个参数以测试活动配置的附加优点。由于值的顺序在CONFIG
变量中很重要(也就是说,最后一组将被认为是互斥值的活动配置),所以可以使用第二个参数来指定一组要考虑的值。例如:
CONFIG = debug
CONFIG += release
CONFIG(release, debug|release):message(Release build!) #will print
CONFIG(debug, debug|release):message(Debug build!) #no print
由于发布被认为是活动设置(对于功能解析),它将是用于生成构建文件的CONFIG
。在通常的情况下,不需要第二个参数,但是对于特定的互斥测试来说,这是非常宝贵的。
如果变量variablename
包含值,则成功;否则失败。可以为参数值指定正则表达式。
你可以使用一个范围来检查这个函数的返回值。
例如:
contains( drivers, network ) {
# drivers contains 'network'
message( "Configuring for network build..." )
HEADERS += network.h
SOURCES += network.cpp
}
只有驱动程序变量包含值网络时才会处理作用域的内容。如果是这种情况,则会将相应的文件添加到SOURCES
和HEADERS
变量中。
如果变量variablename
包含具有指定数量值的列表,则成功;否则失败。
该函数用于确保只有变量包含正确数量的值才能处理范围内的声明。例如:
options = $$find(CONFIG, "debug") $$find(CONFIG,"release")
count(options, 2) {
message(Both release and debug specified.)
}
检查qmake
是否在指定的调试级别运行。如果是,则返回true
并打印调试消息。
测试是否定义了函数或变量名称。如果省略类型,则检查所有功能。要仅检查变量或特定类型的函数,请指定类型。它可以有以下值:
测试variablename
是否等于字符串值。
例如:
TARGET = helloworld
equals(TARGET, "helloworld") {
message("The target assignment was successful.")
}
这个函数永远不会返回一个值。 qmake
将字符串显示为错误消息给用户并退出。此功能只能用于不可恢复的错误。
例如:
error(An error has occurred in the configuration process.)
使用qmake
语法规则计算字符串的内容并返回true
。可以在字符串中使用定义和赋值来修改现有变量的值或创建新的定义。
例如:
eval(TARGET = myapp) {
message($$TARGET)
}
注意:引号可以用来分隔字符串,如果不需要,可以丢弃返回值。
测试是否存在具有给定文件名的文件。如果该文件存在,则该功能成功;否则失败。如果为文件名指定正则表达式,那么如果任何文件与指定的正则表达式匹配,则该函数成功。
例如:
exists( $(QTDIR)/lib/libqt-mt* ) {
message( "Configuring for multi-threaded Qt..." )
CONFIG += thread
}
注意:无论使用哪个平台,都应该使用“/”
作为目录分隔符。
将函数的本地上下文中的变量名的当前值导出到全局上下文中。
开始一个循环遍历列表中的所有值,依次设置迭代到每个值。为了方便,如果列表是1..10
,那么迭代将遍历值1到10。
例如:
LIST = 1 2 3
for(a, LIST):exists(file.$${a}):message(I see a file.$${a}!)
测试变量名的值是否大于值。首先,这个函数试图进行数值比较。如果至少有一个操作数未能转换,则该函数进行字符串比较。
例如:
ANSWER = 42
greaterThan(ANSWER, 1) {
message("The answer might be correct.")
}
直接比较两个数字是不可能的。作为解决方法,使用非数字前缀构造临时值并比较这些值。
例如:
VALUE = 123
TMP_VALUE = x$$VALUE
greaterThan(TMP_VALUE, x456): message("Condition may be true.")
另请参阅lessThan()
。
评估条件。它用于分组布尔表达式。
例如:
if(linux-g++*|macx-g++*):CONFIG(debug, debug|release) {
message("We are on Linux or Mac OS, and we are in debug mode.")
}
将包含文件名的文件的内容包含在当前项目中。如果包含文件名,则此函数成功;否则失败。包含的文件被立即处理。
您可以使用此函数作为范围的条件来检查文件是否包含在内。例如:
include( shared.pri )
OPTIONS = standard custom
!include( options.pri ) {
message( "No custom build options specified" )
OPTIONS -= custom
}
如果文件的文件名(当由qmake
自己解析时)包含变量var
的值为val
,则成功;否则失败。如果不指定val
,则函数将测试是否在文件中分配了var
。
这是CONFIG
功能的别名。
如果变量variablename
为空,则成功;否则失败。这相当于count(variablename,0)
。
例如:
isEmpty( CONFIG ) {
CONFIG += warn_on debug
}
这是equals
函数的别名。
测试variablename
的值是否小于值。作为greaterThan()
。
例如:
ANSWER = 42
lessThan(ANSWER, 1) {
message("The answer might be wrong.")
}
加载功能指定的功能文件(.prf
),除非功能已经加载。
在控制台上打印消息。与消息函数不同,既不会预先输出文本,也不会附加换行符。
另请参阅message()
。
总是成功,并将字符串显示为一般消息给用户。与error()
函数不同,此函数允许处理继续。
message( "This is a message" )
上面的行导致“这是一条消息”被写入控制台。使用引号是可选的,但建议使用。
注意:默认情况下,对于给定的项目,为qmake
生成的每个Makefile
写出消息。如果要确保每条项目只显示一次消息,请在构建过程中结合使用示例来测试build_pass
变量以过滤消息。例如:
!build_pass:message( "This is a message" )
创建目录路径dirPath
。这个函数是QDir :: makepath
函数的一个包装。
评估条件。如果条件为false
,则在构建时,qmake
跳过此项目(及其SUBDIRS
)。
注意:您也可以使用REQUIRES
变量来达到这个目的。但是,我们建议使用此功能。
在辅助shell
中执行给定的命令。如果命令以零退出状态返回,则成功;否则失败。你可以使用一个范围来检查这个函数的返回值。
例如:
system("ls /bin"): HAS_BIN = TRUE
另请参阅替换system()
的变体。
更新文件名的时间戳以匹配reference_filename
的时间戳。
从当前上下文中删除variablename
。
例如:
NARF = zort
unset(NARF)
!defined(NARF, var) {
message("NARF is not defined.")
}
始终成功,并将字符串显示为警告消息给用户。
将variablename
的值写入名称为filename
的文件中,每个值分别放在一行中。如果未指定variablename
,则创建一个空文件。如果模式被追加并且文件已经存在,则附加到该文件而不是替换它。
复杂的测试功能在.prf
文件库中实现。
使用PKGCONFIG
机制来确定在解析项目时是否存在给定的包。
这可以有选择地启用或禁用功能。例如:
packagesExist(sqlite3 QtNetwork QtDeclarative) {
DEFINES += USE_FANCY_UI
}
然后,在代码中:
#ifdef USE_FANCY_UI
// Use the fancy UI, as we have extra packages available
#endif
通过准备遍历所有子目录的目标,促进创建类似于安装目标的项目范围目标。例如:
TEMPLATE = subdirs
SUBDIRS = one two three
prepareRecursiveTarget(check)
具有在.CONFIG
中指定的has_no_default
或no_
的子目录从此目标中排除:
two.CONFIG += no_check_target
您必须手动将准备好的目标添加到QMAKE_EXTRA_TARGETS
:
QMAKE_EXTRA_TARGETS += check
为了使目标具有全局性,上面的代码需要包含在每个子项目中。另外,要使这些目标做任何事情,非子项目子项目都需要包含各自的代码。最简单的方法是创建一个自定义功能文件。例如:
# /features/mycheck.prf
equals(TEMPLATE, subdirs) {
prepareRecursiveTarget(check)
} else {
check.commands = echo hello user
}
QMAKE_EXTRA_TARGETS += check
特征文件需要注入到每个子项目中,例如.qmake.conf
:
# /.qmake.conf
CONFIG += mycheck
建立一个测试项目。如果测试通过,则返回true
,并将config_
添加到CONFIG
变量。否则,返回false
。
要使此功能可用,您需要加载相应的功能文件:
# /project.pro
load(configure)
这也将变量QMAKE_CONFIG_TESTS_DIR
设置为项目父目录的config.tests
子目录。加载特征文件后,可以覆盖此值。
在tests
目录下,每个测试必须有一个包含简单的qmake
项目的子目录。以下代码片段说明了该项目的.pro
文件:
# /config.tests/test/test.pro
SOURCES = main.cpp
LIBS += -ltheFeature
# Note that the test project is built without Qt by default.
以下代码片段说明了该项目的主要.cpp
文件:
// /config.tests/test/main.cpp
#include
int main()
{
return featureFunction();
}
以下代码片段显示了测试的调用:
# /project.pro
qtCompileTest(test)
如果测试项目建成成功,测试通过。
测试结果被自动缓存,这也使所有的子项目都可以使用它们。因此,建议在顶层项目文件中运行所有配置测试。
要抑制重新使用缓存结果,请将CONFIG + = recheck
传递给qmake
。
另请参阅load()
。
检查是否存在由名称指定的Qt模块。有关可能值的列表,请参阅QT。