Qt5.15qmake手册(.pro文件配置详解)来唧唧歪歪(Ljjyy.com)

本文于1240天之前发表,文中内容可能已经过时。

qmake工具有助于简化跨平台的开发项目的构建过程。它用于自动生成Makefile,借助qmake我们创建每个Makefile时可能只需要简单地编写几行信息即可。不管我们的项目是不是用Qt编写的,我们都可以使用qmake来处理项目的构建流程。

qmake根据project文件中的信息生成Makefile。project文件由开发人员创建,通常很简单,当然我们也可以为复杂的项目创建复杂的project文件。

qmake包含了支持Qt开发的附加功能,自动包含了moc和uic的构建规则。

qmake还可以为开发人员不需要任何修改地生成MicrosoftVisualstudio项目文件。

qmake工具为我们提供了一个面向项目的构建系统,用于管理应用程序、库和其他组件的构建过程。利用qmake使我们能够控制所使用的源文件,并可以在单个文件中简要地描述流程中的每个步骤。qmake将每个project文件中的信息解析并生成对应的Makefile文件,之后就可以使用这个Makefile文件执行编译和链接。

项目由project(以.pro为后缀)文件的内容描述。qmake使用project文件中的信息来生成包含构建每个项目所需的所有命令的Makefile。项目文件通常包含源文件和头文件的列表、一般配置信息和任何特定于应用程序的详细信息,例如要链接的额外库的列表或要使用的额外路径的列表。

我们可以为复杂项目创建更复杂的项目文件。有关创建项目文件的更多信息,可以查看创建项目文件。有关可以在项目文件中使用的变量和函数的详细信息,可以查看参考文档。

我们可以使用QtCreator的新建项目向导来创建项目文件。我们选择某个项目模板后QtCreator将创建一个具有默认值的项目文件,使我们能够构建和运行该项目。我们可以通过修改这个默认创建的项目文件的内容来满足我们自己项目的构建需求。

我们还可以使用qmake来生成项目文件。有关qmake命令行选项的更多内容,可以查阅运行qmake

对于简单的项目,我们只需要在项目的顶层(包含project文件的)目录中运行qmake来生成Makefile。然后根据Makefile运行平台的make工具来构建项目即可。

有关qmake在配置构建流程时使用的环境变量的更多信息,可以查阅配置qmak

三方库指南向大家展示了如何在Qt项目中使用简单的三方库。

在大型项目中,可以利用预编译的头文件来加快构建过程。有关更多信息,可以查阅使用预编译头文件。

本节内容将向大家介绍qmake的一些基础知识。本手册中的其他主题将包含有关使用qmake的更详细内容。

假设我们已经完成了应用程序的基本实现,并创建了下列文件:

123hello.cpphello.hmain.cpp我们可以在Qt发行版的examples/qmake/tutorial目录中找到这些文件。关于应用程序的设置功能,我们所需知道的另一件事是它本身是用Qt编写的。首先,使用我们喜欢的纯文本编辑器,在examples/qmake/tutorial中创建一个名为hello.pro的文件。我们需要做的第一件事是添加一些脚本,这些脚本将告诉qmake有关开发项目的源文件和头文件信息。

我们首先将源文件添加到项目文件中。为此,我们需要使用SOURCES变量。我们可以新起一行,并使用SOURCES+=hello.cpp的方式即可添加hello.cpp作为源文件。

1SOURCES+=hello.cpp我们对项目中的每个源文件重复这个步骤:

12SOURCES+=hello.cppSOURCES+=main.cpp如果我们更喜欢使用Make-like的语法:把所有的文件都在一行中列出,我们可以像下面这样使用换行转义的方式:

12SOURCES=hello.cpp\main.cpp现在源文件已列在项目文件中,接下来我们添加头文件。头文件的添加方式与源文件完全相同,只是我们使用的变量名是HEADERS。完成此操作后,我们的项目文件类似下面所示:

1234HEADERS=hello.hSOURCES=hello.cpp\main.cpp目标文件名称是自动设置的。它一般与项目文件名相同,并带有适合平台的后缀。例如,如果项目文件被称为hello.pro,目标文件的名称在Windows平台上将是hello.exe,而在Unix平台上将是hello。如果我们想使用一个自定义的名字,我们可以在项目文件中,使用TARGET变量,并添加类似下面的脚本进行设置(建议将这个设置放在项目文件的起始处):

1TARGET=helloworld之后完成的项目文件类似下面这样:

123456TARGET=helloworldHEADERS=hello.hSOURCES=hello.cpp\main.cpp现在可以使用qmake为这个应用程序生成Makefile文件了。启动命令行,并进入项目文件所在的目录中,然后键入以下内容:

1qmake-oMakefilehello.pro然后我们可以键入make(或nmake)来完成编译。

对于VisualStudio用户,qmake也可以用来生成VisualStudio项目文件。其命令如下:

12345678TARGET=helloworldHEADERS=hello.hSOURCES=hello.cpp\main.cppCONFIG+=debug我们还是像之前一样使用qmake来生成Makefile。现在,在调试环境中运行应用程序时,我们将获得有关应用程序有用的调试信息。

现在假设我们有两个新文件要包含到项目文件中:hellowin.cpp和hellounix.cpp。我们不能仅仅将它们添加到SOURCES变量中就完事了,因为这会将两个文件都放在Makefile中。因此,我们在这里需要做的是使用一个作用域,它将根据我们为哪个平台构建而被进入并处理内部的脚本。

完成之后,我们的项目文件将类似下面这样:

如果某个文件不存在,我们可能就不想创建Makefile了。我们可以使用exists()函数检查文件是否存在。我们可以使用error()函数停止qmake的处理。这与作用域的工作方式相同。只需用函数替换作用域条件。对main.cpp文件的检查的示例如下:

假设我们正在使用Windows平台,并且希望在命令行上运行应用程序时能够使用qDebug()查看语句输出。要查看输出,必须使用适当的控制台设置来构建应用程序。我们可以通过将console添加到CONFIG变量中很容易地实现这个设置,这样在Windows的Makefile中就会包含此设置。但是,我们假设只在运行Windows和已经在CONFIG变量上添加了debug时才添加console到CONFIG变量。这时就需要使用两个相互嵌套的作用域。我们把要处理的设置放在第二个左右域内,像下面这样:

以下各节介绍项目文件中使用的不同类型的元素。

在项目文件中,变量用于保存字符串列表。在最简单的项目中,这些变量通知qmake有关要使用的配置选项,或者提供要在构建过程中使用的文件名和路径。

qmake查找每个项目文件中的某些变量,并且它使用这些变量的内容来确定它应该写入Makefile的内容。例如,HEADERS和SOURCES变量中的值列表用于告诉qmake关于与项目文件位于同一目录中的头和源文件。

变量还可用于内部存储临时值列表,并且可以用新值覆盖或扩展现有的值列表。

以下代码段说明了如何将值列表分配给变量:

1HEADERS=mainwindow.hpaintwidget.h变量中的值列表以下列方式扩展:

123SOURCES=main.cppmainwindow.cpp\paintwidget.cppCONFIG+=console注意:第一个赋值仅包括与HEADERS变量在同一行上指定的值。第二个赋值使用反斜杠(\)跨行拆分SOURCES变量中的值。

CONFIG变量是qmake生成Makefile时使用的另一个特殊变量。我们将在常规配置中讨论它。在上面的代码段中,console将添加到CONFIG中包含的现有值列表中。

下表列出了一些常用的变量并简单描述了它们的内容。有关变量及其描述的完整列表,请参见Variables。

变量的内容可以通过在变量名前面加上$$来读取。这可以用来将一个变量的内容分配给另一个变量:

1TEMP_SOURCES=$$SOURCES$$操作符与对字符串和值列表进行操作的内置函数一起被广泛使用。有关更多信息,请参见qmake语言

通常,空格用于分隔为变量分配的值。要指定包含空格的值,必须用双引号将包含空格的值括起来:

1DEST="ProgramFiles"引号引用的文本在变量持有的值列表中被视为单个项。类似的方法也可用于处理包含空格的路径,尤其是在为Windows平台定义INCLUDEPATH变量时:

12#Commentsusuallystartatthebeginningofaline,butthey#canalsofollowothercontentonthesameline.要在变量赋值中包含#字符,需要使用内置的LITERAL_HASH变量的内容。

qmake提供了许多内置函数,以便处理变量的内容。在简单的项目文件中最常用的函数是include()函数,该函数将文件名作为参数。给定文件的内容包含在项目文件中使用include函数的位置。include函数最常用来包含其他项目文件:

1include(other.pro)对条件结构的支持是通过作用域提供的,作用域的行为类似于编程语言中的if语句:

只有在条件为真时,大括号内的赋值才会执行。在这种情况下,必须添加win32的CONFIG设置选项。这在Windows上是自动发生的,无需主动添加。注意左大括号必须与条件位于同一行上。

对通常需要循环的变量或更复杂的操作由内置函数,如find()、unique()和count()提供。这些函数以及其他许多函数用于操作字符串和路径、支持用户输入和调用外部工具。有关使用函数的更多信息,请参见qmake语言。有关所有函数及其描述的列表,请参见替换功能和测试功能。

下表总结了可用的项目类型,并描述了qmake将为每个项目生成的文件:

有关为使用app和lib模板的项目编写项目文件的建议,请参阅构建常见项目类型。

当使用subdirs模板时,qmake生成一个Makefile来检查每个指定的子目录,处理它在其中找到的任何项目文件,并在新创建的Makefile上运行平台的make工具。SUBDIRS变量可用于包含要处理的所有子目录的列表。

CONFIG变量指定项目应该配置的选项和特性。

项目可以在debug或release模式下构建,也可以同时在debug和release模式下构建。如果同时指定了debug和release,则最后一个将生效。如果您指定debug_and_release选项来构建项目的debug和release版本,那么qmake生成的Makefile包含生成两个版本的规则。这可以通过以下方式调用:

1makeall将build_all选项添加到CONFIG变量会使该规则成为构建项目时的默认规则。

注意:CONFIG变量中指定的每个选项也可以用作范围条件。我们可以使用内置的CONFIG()函数来测试某些配置选项是否存在。例如,下面几行代码将该函数显示为作用域中的条件,以测试是否使用了opengl这个选项:

以下选项定义要构建的项目类型。

应用程序和库项目模板为我们提供了更专门的配置选项来优化构建过程。选项将在构建常见项目类型中详细说明。

例如,如果我们的应用程序使用Qt库,并且我们希望在调试模式下构建它,那么我们的项目文件可以包含以下行:

1CONFIG+=qtdebug注意:我们必须使用“+=”,而不是“=”,否则qmake将无法使用Qt的配置来确定我们的项目所需的设置。

1QT=networkxml#省略了core模块和gui模块如果我们想要构建一个没有gui模块的项目,我们需要使用“-=”操作符来排除它。默认情况下,QT同时包含core模块和gui模块,所以下面这行代码将生成一个小一些的QT项目:

1QT-=gui#仅使用core模块有关可以添加到QT变量的Qt模块列表,请参阅QT。

qmake可以使用feature(.prf)文件中指定的额外配置功能来设置。这些额外的特性通常为构建过程中使用的自定义工具提供支持。要在构建过程中添加要素,将要素名称(要素文件名的词干)追加到CONFIG变量中。

例如,qmake可以配置生成过程,以利用pkg-config支持的外部库(如D-Bus和ogg,使用以下代码行:

12CONFIG+=link_pkgconfigPKGCONFIG+=oggdbus-1有关添加功能部件的更多信息,请参见添加新配置功能部件。

如果除了使用Qt提供的库外,我们还使用了其他库,则需要在项目文件中指定它们。

qmake搜索库的路径和要链接到的特定库可以添加到LIBS变量中的值列表中。我们可以指定库的路径,或使用Unix样式表示法来指定库和路径。

例如,下面几行显示了如何指定库:

1LIBS+=-L/usr/local/lib-lmath可以使用INCLUDEPATH变量以类似方式指定包含头文件的路径。

例如,添加几个路径来搜索头文件:

此处不介绍特定于平台的变量。有关详细信息,可以参阅QtforWindows-Deployment和QtformacOS

app模板告诉qmake生成一个Makefile来构建应用程序。使用此模板,可以通过向CONFIG变量定义添加以下选项之一来指定应用程序的类型:

对于上面列出的这些变量,我们只需要使用具有值的系统变量即可。例如,如果我们没有任何额外的包含路径,那么我们就不需要使用INCLUDEPATH。qmake会自动添加必要的默认值。一个项目文件的例子像下面这样:

1234567TEMPLATE=appDESTDIR=c:/helloappHEADERS+=hello.hSOURCES+=hello.cppSOURCES+=main.cppDEFINES+=USE_MY_STUFFCONFIG+=release对于只需要单一值的属性项,例如TEMPLATE或DESTDIR,我们使用“=”;但是对于多值项,我们使用“+=”来将现有项添加到该类型。使用“=”将使值替换为新值。例如,我们写成DEFINES=USE_MY_STUFF,则删除列表中所有其他的预处理器定义。

testcase项目是一个app项目,它将作为一个自动测试来运行。任何应用程序都可以通过向CONFIG变量添加值testcase来标记为testcase

对于testcase项目,qmake将在生成的Makefile中插入一个checktarget。这个target将运行应用程序。如果测试终止时退出码为零,则认为测试通过。

checktarget可以通过SUBDIRS自动递归。这意味着可以在SUBDIRS项目中运行makecheck命令来运行整个测试套件。

checktarget的执行行为可以由某些Makefile变量定制。这些变量是:

注意:上面的变量是在调用make工具时设置,而不是在.pro文件中设置的。大多数make工具支持直接在命令行上设置Makefile变量:

12345#Runteststhroughtest-wrapperandusexunitxmloutputformat.#Inthisexample,test-wrapperisafictionalwrapperscriptwhichterminates#atestifitdoesnotcompletewithintheamountofsecondssetby"--timeout".#The"-oresult.xml,xunitxml"optionsareinterpretedbyQTestLib.makecheckTESTRUNNER="test-wrapper--timeout120"TESTARGS="-oresult.xml,xunitxml"Testcase项目可以通过以下CONFIG选项进一步定制:

测试用例通常是用QTest或TestCase编写的,但是使用CONFIG+=testcase和makecheck并不是必需的。唯一必须的要求是测试程序在成功时退出码为零,失败时退出码为非零。

lib模板告诉qmake生成一个Makefile来构建一个库。在使用lib模板时,除了具有app模板支持的系统变量之外,它还支持VERSION变量。使用它可以在.pro文件中指定有关库的信息。

在使用lib模板时,可以在CONFIG变量中添加以下选项来确定要构建的库的类型:

|选项|描述||dll|该库是一个共享库(dll)||staticlib|该库是一个静态库||plugin|该库是一个插件|

还可以定义以下选项来提供关于库的其他信息。

插件是使用lib模板构建的,如前一节所述。这告诉qmake为项目生成Makefile,该Makefile将以适合每个平台的形式(通常是库的形式)构建插件。与普通库一样,VERSION变量也可用于指定关于插件的信息。

1QT+=widgetsdesigner有关基于插件的项目的更多示例,请参见QtDesigner示例。

有时,以调试和发布模式构建项目是必要的。尽管CONFIG变量可以同时包含debug和release选项,但是只应用最后指定的选项。

要使项目能够在两种模式下构建,我们必须将debug_and_release选项添加到CONFIG变量:

当qmake处理项目文件时,它将生成一个Makefile规则,以允许在两种模式下构建项目。这可以通过以下方式调用:

1makeallbuild_all选项可以添加到项目文件中的CONFIG变量中,以确保项目在默认情况下以两种模式构建:

1CONFIG+=build_all这允许使用默认规则处理Makefile:

1makeinstall可以根据目标平台定制构建目标的名称。例如,一个库或插件可以在Windows上使用与Unix平台不同的约定来命名:

qmake的行为可以通过在命令行上指定各种选项来定制。它们允许对构建过程进行微调,提供有用的诊断信息,并可用于指定项目的目标平台。

用于运行qmake的语法采用以下简单形式:

注意:创建的文件可能需要额外的编辑。例如,添加QT变量以适应项目所需的模块需求。

可以使用这些options指定常规设置和特定于模式的设置。只适用于Makefile模式的选项在Makefile模式选项部分进行了描述,而影响项目文件创建的选项则在项目模式选项部分进行了描述。

files参数表示一个或多个项目文件(以空格分隔)的列表。

可以在qmake的命令行上指定各种选项,以便定制构建过程,并覆盖平台的默认设置。下面的基本选项提供了使用qmake的帮助,指定qmake在哪里写入输出文件,并控制将写入控制台的调试信息的级别:

用于项目的模板通常由项目文件中的TEMPLATE变量指定。我们可以使用以下选项覆盖或修改此设置:

警告信息的级别可以进行微调,以帮助您发现项目文件中的问题:

1qmake-makefile[options]files在Makefile模式下,qmake将生成一个用于构建项目的Makefile。此外,在这种模式下,可以使用以下选项来影响生成项目文件的方式:

我们还可以在命令行上传递qmake赋值。它们在所有指定的文件之前被处理。例如,下面的命令从test.pro生成Makefile:

1qmake-makefile-oMakefile"CONFIG+=test"test.pro但是,某些指定的选项可以省略,因为它们是默认的qmake行为:

1qmake"CONFIG+=test"test.pro如果我们确定希望在指定文件之后处理变量,那么可以传递-after选项。当指定此值时,命令行中-after选项之后的所有赋值都将延迟到解析指定的文件之后。

1qmake-project[options]files在项目模式下,qmake将生成一个项目文件。此外,我们可以在此模式下提供以下选项:

还可以在此模式下在命令行上传递赋值。当这样做时,这些任务将放在生成的项目文件的最后。

这些平台特有的特性包括支持创建通用的二进制文件(binaries)、框架(frameworks)和包(bundles)。

源包中提供的qmake版本配置与二进制包中提供的qmake稍不同,因为它使用不同的功能规范。当源包通常使用macx-g++规范时,二进制包通常配置为使用macx-xcode规范。

两种包的用户都可以通过使用-spec选项调用qmake来覆盖此配置(有关更多信息,请参见运行qmake)。例如,要使用来自二进制包中的qmake在项目目录中创建Makefile,可以调用以下命令:

标准框架目录以外的目录需要指定到生成系统,这是通过将链接器选项追加到LIBS变量来实现的,如以下示例所示:

1LIBS+=-F/path/to/framework/directory/框架本身是通过附加-framework选项和框架的名称到LIBS变量来链接的:

12TEMPLATE=libCONFIG+=lib_bundle与库关联的数据是使用QMAKE_BUNDLE_DATA变量指定的。它包含将与库包一起安装的项,通常用于指定头文件集合,如下面的示例所示:

1234FRAMEWORK_HEADERS.version=VersionsFRAMEWORK_HEADERS.files=path/to/header_one.hpath/to/header_two.hFRAMEWORK_HEADERS.path=HeadersQMAKE_BUNDLE_DATA+=FRAMEWORK_HEADERS我们可以使用FRAMEWORK_HEADERS变量指定特定框架所需的头文件。将其追加到QMAKE_BUNDLE_DATA变量可确保将这些头文件的信息添加到将与库一起安装的资源集合中。此外,框架名称和版本由QMAKE_FRAMEWORK_BUNDLE_NAME和QMAKE_FRAMEWORK_VERSION变量指定。默认情况下,用于这些变量的值是从TARGET变量和VERSION变量获取的。

有关部署应用程序和库的详细信息,请参阅QtformacOS-Deployment

macOS上的开发人员可以利用qmake对Xcode项目文件的支持,正如QtformacOS文档中所描述的那样。通过运行qmake从现有的qmake项目文件生成Xcode项目。例如:

1qmake-specmacx-xcodeproject.pro注意:如果以后将项目移动到磁盘上,则必须再次运行qmake来处理项目文件并创建一个新的Xcode项目文件。

实现这一点目前是不可行的,因为Xcode的活动构建配置概念与qmake的构建目标概念在概念上是不同的。

Xcode活动构建配置设置用于修改Xcode配置、编译器标志和类似的构建选项。与VisualStudio不同,Xcode不允许根据选择的是调试还是发布构建配置来选择特定的库文件。qmake调试和发布设置控制哪些库文件链接到可执行文件。

目前无法从qmake生成的Xcode项目文件中设置Xcode配置设置中的文件。库在Xcode构建系统的框架和库阶段的链接方式。

此外,所选的活动构建配置存储在.pbxuser文件中,该文件是由Xcode在第一次加载时生成的,而不是由qmake创建的。

该平台特有的特性包括支持Windows资源文件(提供的或自动生成的)、创建VisualStudio项目文件,以及在部署使用VisualStudio2005或更高版本开发的Qt应用程序时处理清单文件。

本节介绍如何使用qmake处理Windows资源文件,使其链接到应用程序可执行文件(EXE)或动态链接库(DLL)。qmake可以有选择地自动生成一个适当填充的Windows资源文件。

一个链接的Windows资源文件可以包含许多元素,这些元素可以通过它的EXE或DLL来访问。但是,Qt资源系统应该用于以独立于平台的方式访问链接的资源。但是链接的Windows资源文件的一些标准元素可以被Windows本身访问。例如,在Windows资源管理器中,文件属性的版本选项卡由资源元素填充。此外,EXE的程序图标是从这些元素中读取的。因此,Qt创建的WindowsEXE或DLL同时使用这两种技术是一个很好的实践:通过Qt资源系统链接平台无关的资源,并通过Windows资源文件添加Windows特定的资源。

通常,资源定义脚本(将.rc文件编译为Windows资源文件。在Microsoft工具链中,RC工具生成一个.res文件,该文件可以通过Microsoft链接器链接到EXE或MinGW工具链使用windres工具生成一个.o文件,该文件可以通过MinGW链接器链接到EXE或DLL

通过设置至少一个系统变量VERSION,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

本节介绍如何将现有的qmake项目导入VisualStudio。qmake能够获取一个项目文件并创建一个包含开发环境所需的所有必要信息的VisualStudio项目。这是通过将qmake项目模板template设置为vcapp(用于应用程序项目)或vclib(用于库项目)来实现的。

这也可以通过命令行选项来设置,例如:

1qmake-tpvc可以递归地生成子目录中的.vcproj文件和主目录中的.sln文件,只需输入:

1qmake-tpvc-r每次更新项目文件时,我们都需要运行qmake来生成更新的VisualStudio项目

注意:如果我们正在使用VisualStudio附加程序,请选择Qt>Importfrom.profile导入.pro文件

在部署使用VisualStudio2005或其更高版本构建的Qt应用程序时,请确保正确处理了在链接应用程序时创建的清单文件。对于生成dll的项目,这是自动处理的。

删除嵌入到应用程序可执行文件的清单可以通过以下CONFIG变量的赋值来完成:

1CONFIG-=embed_manifest_exe此外,可以通过以下CONFIG变量的赋值来删除嵌入dll的清单:

1CONFIG-=embed_manifest_dll更详细的内容请查阅Windows部署指南。

在大多数工程文件中,分配操作符(=)和添加操作符(+=)可被用来引入(include)有关于项目的几乎全部信息。典型的使用方式是分配给一个变量的值列表,并且我们可以依据各种测试的结果来添加更多的值。由于qmake有时候会使用默认值来初始化某些变量,因此此时使用删除(-=)操作符来过滤掉不需要的值就是相当必要的了。以下内容将会讲解用操作符来修改变量的内容的方法。

我们使用=操作符将值指定给一个变量:

1TARGET=myapp在上一行中,设定TARGET变量的值为myapp,这样我们就可以使用一个“myapp”值来覆盖任何以前设置给TARGET的值了

+=操作符将在一个变量的值列表添加一个新值:

1DEFINES+=USE_MY_STUFF在上面一行语句中我们附加USE_MY_STUFF到预定义列表,这样我们就可以在Makefile中使用USE_MY_STUFF这个预定义了

-=操作符用于在一个变量的值列表中删除一个值:

1DEFINES-=USE_MY_STUFF在上面一行语句中我们从预定义列表中移除USE_MY_STUFF的预定义,这样在Makefile中的有关USE_MY_STUFF的预定义将会失效

*=操作符也被用于在一个变量的值列表中添加一个值,但只有当它不是已存在变量的时候才有效。这可以防止变量值被多次的包含在一个变量中列表。例如:

1DEFINES*=USE_MY_STUFF上面的语句中,USE_MY_STUFF将只有在预定义列表中不存在该定义时才会被添加,友情提示,unique()函数也可以用来确保一个变量的每个值只包含一个实例

~=操作符用于用指定的值替换任何一个相匹配的正则表达式的值:

1DEFINES~=s/QT_[DT].+/QT上面一行语句中,在预定义列表中的任何以QT_D或者QT_T开头的预定义都将被替换为QT

$$操作符被用于提取变量的内容,并且也能被用作在变量之间传值,或者传递这些值给函数

123EVERYTHING=$$SOURCES$$HEADERSmessage("Theprojectcontainsthefollowingfiles:")message($$EVERYTHING)变量可以用来存储环境变量的内容。这些可以在运行qmake时使用,或者在生成项目时生成的Makefile中使用。

要在运行qmake时获取环境值的内容,请使用$$(...)运算符:

12DESTDIR=$$(PWD)message(Theprojectwillbeinstalledin$$DESTDIR)在上面的分配中,当处理项目文件时读取PWD环境变量的值。

要在生成的Makefile文件被处理时获取环境值的内容,请使用$(...)运算符:

123456DESTDIR=$$(PWD)message(Theprojectwillbeinstalledin$$DESTDIR)DESTDIR=$(PWD)message(TheprojectwillbeinstalledinthevalueofPWD)message(whentheMakefileisprocessed.)在上面的代码中,处理项目文件时会立即读取PWD的值,但在生成的Makefile文件中将$(PWD)的值分配给DESTDIR变量发生在Makefile文件被处理时。这使得构建过程更加灵活,只要在处理Makefile时正确设置环境变量即可

特殊的$$[...]操作符可用于访问qmake属性:

123456789101112message(Qtversion:$$[QT_VERSION])message(Qtisinstalledin$$[QT_INSTALL_PREFIX])message(Qtresourcescanbefoundinthefollowinglocations:)message(Documentation:$$[QT_INSTALL_DOCS])message(Headerfiles:$$[QT_INSTALL_HEADERS])message(Libraries:$$[QT_INSTALL_LIBS])message(Binaryfiles(executables):$$[QT_INSTALL_BINS])message(Plugins:$$[QT_INSTALL_PLUGINS])message(Datafiles:$$[QT_INSTALL_DATA])message(Translationfiles:$$[QT_INSTALL_TRANSLATIONS])message(Settings:$$[QT_INSTALL_CONFIGURATION])message(Examples:$$[QT_INSTALL_EXAMPLES])更多内容,大家可以查阅Configuringqmake文档

条件域包含一个条件后跟一个在同一行的左花括号,然后是一系列的命令和定义,最后是在新的一行的一个右花括号。就像下面这样:

当然我们也可以逆向思维,达到同样的目的,例如我们使用下面的语句:

条件域可嵌套组合多个条件。例如,如果您想要为一个特定的平台中,在满足了调试的被启用后,包含(include)一个特定的文件,然后你就可以写如下代码:

为了简化嵌套条件域,我们可以使用:操作符,对于上一个例子中的功能,我们可以用如下代码来简化它:

1win32:DEFINES+=USE_MY_STUFF上面一行的作用是,仅在windows平台上添加USE_MY_STUFF定义到DEFINES列表。通常,:操作符很像是逻辑与(&&)操作符,它会拼接一些条件,并且要求它们都为真。

我们也有|操作符,用来实现像逻辑或操作符(||)一样的功能,它用来连接一些条件,并且仅要求其中至少一个为真。例如:

我们也可以编写复杂的测试语句,对条件进行逐一的测试,这主要依靠“else”来完成,例如我们可以像下面这样写我们的代码:

1CONFIG+=opengl如果我们像上面那样做的话,任何测试opengl的条件域都将是有效的,并且会被处理,我们可以使用这个功能给最后的可执行文件一个适当的名称:

正因为我们可以把自定义的值附加给CONFIG,我们就可以很方便的定制项目文件和调整Makefile文件。

除了win32,macx和unix这样的常用于条件域条件的值,还有其他各种内置平台和编译器具体值也可以在条件域中用于测试。这些基于平台规范在Qt的mkspecs目录中被提供。例如,下面的代码用于显示当前使用的规范并且测试linux-g++规范。

项目文件中使用的许多变量是qmake在生成Makefile时使用的特殊变量,例如DEFINES、SOURCES和HEADERS。此外,我们可以创建供自己使用的变量。qmake在遇到给定名称的赋值时创建具有该名称的新变量。例如:

1MY_VARIABLE=value对于如何处理自己的变量没有限制,因为qmake会忽略它们,除非在处理作用域时需要对它们求值。

还可以通过在变量名前面加上$$来将当前变量的值赋给另一个变量。例如:

1MY_DEFINES=$$DEFINES现在MY_DEFINES变量包含项目文件中定义变量中的内容。这也等价于:

123HEADERS=model.hHEADERS+=$$OTHER_HEADERSHEADERS=$$unique(HEADERS)这种类型的函数应该在赋值的右侧使用(即作为操作数)。

我们可以定义自己的函数来处理变量的内容如下:

可以定义自己的函数来为条件域提供条件。下面的示例测试列表中的每个文件是否存在,如果都存在则返回true,如果有一个文件不存在则返回false:

以下features目录被用于搜索features文件:

例如,在项目文件中添加以下代码:

1CONFIG+=myfeatures附加属性到CONFIG变量,qmake将在完成项目文件的解析后,在上面列出的位置中搜索myfeatures.prf文件。以Unix系统为例,它将查找以下文件:

注意:.prf文件的名称必须小写

在Unix上使用构建工具来安装应用程序和库是很常见的;例如,通过调用makeinstall。由于这个原因,qmake具有installset(安装集)的概念,即包含有关如何安装项目的一部分的说明的对象。例如,一组文档文件可以用以下方式描述:

12documentation.path=/usr/local/program/docdocumentation.files=docs/*path成员通知qmake文件应该安装在/usr/local/program/doc(path成员)中,而files成员指定应该复制到安装目录的文件。在本例中,docs目录中的所有内容都将被复制到/usr/local/program/doc中。

一旦一个安装集已经完全描述,我们可以通过如下方式附加它到安装列表:

1INSTALLS+=documentationqmake将确保将指定的文件复制到安装目录。如果需要对这个过程进行更多控制,还可以为对象的extra(额外)成员提供定义。例如,下面的行告诉qmake为这个安装集执行一系列命令:

1unix:documentation.extra=create_docs;mvmaster.doctoc.docunix条件域确保这些特定的命令只在unix平台上执行。可以使用其他范围规则为其他平台定义适当的命令。

在extra(额外)成员中指定的命令将在对象的其他成员中的指令执行之前执行。

如果我们将内置安装集附加到INSTALLS变量,并且没有指定files或extra成员,qmake将决定需要为我们复制什么。目前,支持target和dlltarget安装集。例如:

12target.path=/usr/local/myprogramINSTALLS+=target在上面的代码行中,qmake知道需要复制什么,并将自动处理安装过程。

Makefile输出的定制是通过对象样式的API执行的,在qmake的其他地方可以找到这种API。对象是通过指定其成员自动定义的。例如:

12345mytarget.target=.buildfilemytarget.commands=touch$$mytarget.targetmytarget.depends=mytarget2mytarget2.commands=@echoBuilding$$mytarget.target上面的代码定义了一个名为mytarget的qmake目标,其中包含一个名为.buildfile的Makefile目标,该目标由touch命令生成。最后,.depends成员指定mytarget依赖于mytarget2,这是之后定义的另一个目标。mytarget2是一个虚拟目标。它只被定义为将一些文本打印到控制台。

最后一步是使用QMAKE_EXTRA_TARGETS变量来指示qmake这个对象是要构建的目标:

1QMAKE_EXTRA_TARGETS+=mytargetmytarget2这就是实际构建自定义目标所需要做的全部工作。当然,我们可能希望将其中一个目标绑定到qmake构建目标。要做到这一点,我们只需要在PRE_TARGETDEPS列表中包含Makefile目标。

自定义目标规范支持以下成员:

可以自定义qmake来支持新的编译器和预处理程序:

自定义编译器规范支持以下成员:

此时CONFIG成员支持以下选项:

通常,当链接到一个库时,qmake依赖于底层平台来了解这个库链接到哪些其他库,并让平台将它们拉进来。然而,在许多情况下,这是不够的。例如,当静态地链接一个库时,不会链接到其他库,因此不会创建对这些库的依赖关系。但是,以后链接到这个库的应用程序需要知道在哪里可以找到静态库需要的符号。如果显式启用跟踪,则qmake尝试在适当的情况下跟踪库的依赖项。

第一步是在库本身中启用依赖项跟踪。要做到这一点,你必须告诉qmake保存关于library的信息:

此过程的第二步是启用在使用静态库的应用程序中读取此元信息:

预编译头文件(PCH)是一些编译器支持的一种性能特性,用于编译稳定的代码体,并将代码的编译状态存储在二进制文件中。在后续编译期间,编译器将加载存储的状态,并继续编译指定的文件。因为稳定的代码体不需要重新编译,所以后续的每次编译都会更快。

qmake支持在一些平台和构建环境中使用预编译头文件,包括:

预编译头必须包含在整个项目中稳定且静态的代码。一个典型的预编译头可能是这样的:

1234567891011121314//AddCincludeshere#ifdefined__cplusplus//AddC++includeshere#include#include#include#include//Qtincludes#include#include#include"thirdparty/include/libmain.h"#include"my_stable_class.h"...#endif注意:预编译头文件需要将C包含从C++包含中分离出来,因为用于C文件的预编译头文件可能不包含C++代码。

要让我们的项目使用预编译头文件,我们只需要在我们的项目文件中定义PRECOMPILED_HEADER变量:

1PRECOMPILED_HEADER=stable.hqmake将处理剩下的工作,以确保创建和使用预编译头文件。我们不需要在HEADERS中包含预编译头文件,因为如果配置支持预编译头文件,qmake就会这样做。

默认情况下,MSVC和g++的设定目标窗口启用了precompile_header

使用此选项,我们可以在使用预编译头文件时触发项目文件中的条件块来添加设置。例如:

12PRECOMPILED_HEADER=window.hSOURCES=window.cpp为了避免类似的潜在冲突,最好为将要预编译的头文件提供独特的名称。

我们可以在Qt发行版的examples/qmake/precompile目录中找到以下源代码:

下图在QtCreator设计模式中显示了mydialog.ui文件。我们可以在编辑模式下查看其代码。

qmake-precompile-ui

1qmake-setPROPERTYVALUE我们可以使用适当的属性名和值来代替上面命令中的PROPERTY和VALUE的内容

我们可以在qmake中通过如下两种方式查看属性信息:

12qmake-queryPROPERTYqmake-query#请求展示全部的PROPERTY/VALUE对的列表注意:qmake-query除了使用qmake-set属性值设置的属性外,还列出了内置属性。这些信息将被保存到QSettings对象中(这意味着它将存储在不同平台的不同位置)。

下面的列表中列出了内置的属性:

例如,我们可以使用QT_INSTALL_PREFIX属性查询这个版本的qmake对应的Qt的安装目录:

1qmake-query"QT_INSTALL_PREFIX"我们可以在qmake的project文件中通过如下方式使用上面所列出的属性值,具体示例如下所示:

QMAKESPEC环境变量通常包含以下内容:

注意:QMAKESPEC路径将在INCLUDEPATH系统变量的内容之后自动添加到生成的Makefile中。

缓存文件是一个特殊的qmake读取文件,用于查找qmake.conf文件、项目文件或命令行中未指定的设置。运行qmake时,它查找一个名为.qmake的文件。缓存在当前目录的父目录中,除非指定-nocache。如果qmake没有找到这个文件,它将静默地忽略这个处理步骤。

如果qmake找到这个.qmake文件。则它将在处理项目文件之前先处理这个文件。

在正常情况下,qmake将尝试为我们的平台使用适当的文件扩展名。但是,有时需要覆盖每个平台的默认选项,并显式定义qmake要使用的文件扩展名。这是通过重新定义某些内置变量来实现的。例如,moc文件使用的扩展名可以在项目文件中通过以下方式重新定义:

1QMAKE_EXT_MOC=.mymoc以下变量用于重新定义可被qmake识别的常见文件扩展名:

上面所有的属性都只接受第一个值,因此我们必须为它分配一个值,该值将在整个项目文件中使用。另外,还有两个变量接受一个值列表:

指定项目配置和编译器选项。这些值是qmake内部认可的,具有特殊的意义

下面的CONFIG选项值控制编译器和链接器标志:

当我们使用debug_and_release选项(这是Windows下的默认选项)时,项目将被处理三次:一次生成“meta”Makefile,两次生成Makefile.Debug和Makefile.Release

在后者的传递过程中,build_pass和相应的debug或release选项被附加到CONFIG中。这使得执行特定于构建的任务成为可能。例如:

元Makefile通过debug和release目标来调用子构建,通过all目标来组合构建。当使用build_all作为CONFIG选项时,组合构建是默认的。否则,设置(debug,release)中最后指定的CONFIG选项将确定默认值。在这种情况下,我们可以显式地调用all目标来一次性构建两个配置

1makeall注意:在生成VisualStudio和Xcode项目时,细节略有不同

当链接一个库时,qmake依赖于底层平台来了解这个库所链接的其他库。但是,如果静态链接,qmake将不会得到这个信息,除非我们使用以下配置选项:

注意:在构建静态库时需要create_prl选项,而在使用静态库时需要link_prl选项

以下选项定义应用程序或库类型:

下面这些选项是只在Windows上定义特定的功能:

以下选项仅对macOS有效:

bundle的构建过程还受到QMAKE_BUNDLE_DATA变量内容的影响

以下选项仅在Linux/Unix平台上有效:

解析作用域时,还将检查CONFIG变量。我们可以为此变量分配任何内容。

例如:

这个变量是在Qt5.13.2中引入的。

指定发布配置的预处理器定义。这个变量的值在项目加载后被添加到DEFINES中。这个变量通常在qmake.conf中设置,很少需要修改。

注意:对于MSVCmkspecs,这个变量在默认情况下包含值NDEBUG。

注意:这个变量只在Windows平台上使用app模板时使用。

指定要包含在项目中的.def文件。

指定qmake要扫描的目录列表,以解析依赖项。当qmake遍历源代码中#include的头文件时,将使用此变量。

指定将目标文件放在何处例如:

1DESTDIR=../../lib注意:支持的字符列表可以依赖于使用的生成工具。特别是,括号不适用于make。

指定要包含在dist目标中的文件列表。该特性只受UnixMake规范支持例如:

指定复制目标(target)dll的位置

指定翻译(.ts)文件列表,其中包含将用户界面文本翻译为非本机语言的内容。

与TRANSLATIONS不同,EXTRA_TRANSLATIONS中的翻译文件仅由lrelease处理,而不是lupdate

我们可以使用CONFIG+=lrelease在构建过程中自动编译文件,并使用CONFIG+=lreleaseembed_translations使它们在Qt资源系统中可用

有关Qt国际化(i18n)和本地化(l10n)的更多信息,请参阅QtLinguist手册。

指定UI文件(参见Qt设计器手册)在编译前由uic处理。构建这些UI文件所需的所有依赖项、头文件和源文件将自动添加到项目中示例:

此变量仅特定于.vcproj文件;否则将被忽略

定义项目的头文件列表。

qmake自动检测头文件中的类是否需要moc,并将适当的依赖项和文件添加到项目中,以生成和链接moc文件。

例如:

123HEADERS=myclass.h\login.h\mainwindow.h另请参阅SOURCES

此变量仅在MacOS上用于设置应用程序图标。有关更多信息,请参见应用程序图标文档

此变量仅用于在Windows上生成VisualStudio项目,以将指定的文件放在生成的文件夹中

指定编译项目时应该搜索的#include目录。

1INCLUDEPATH=c:/msdev/included:/stl/include要指定包含空格的路径,请使用空格中描述的双引号方式引用该路径:

例如,下面的target.path定义描述安装构建目标的位置,INSTALLS任务将构建目标添加到要安装的现有资源列表中:

12target.path+=$$[QT_INSTALL_PLUGINS]/imageformatsINSTALLS+=targetINSTALLS有一个.CONFIG成员,它可以接受几个值:

有关更多信息,请参见InstallingFiles

此变量还用于指定将部署到嵌入式设备的其他文件

指定Lex实现文件的列表。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定中间Lex对象文件的名称。这个变量的值通常由qmake处理,很少需要修改。

指定Lex源文件列表。所有依赖项、头文件和源文件将自动添加到项目中,以构建这些lex文件。例如:

12unix:LIBS+=-L/usr/local/lib-lmathwin32:LIBS+=c:/mylibs/math.lib要指定包含空格的路径,请使用空格中描述的双引号方式引用该路径:

12win32:LIBS+="C:/mylibs/extralibs/extra.lib"unix:LIBS+="-L/home/user/extralibs"-lextra默认情况下,存储在LIBS中的库的列表在使用之前被缩减为唯一名称的列表。要更改此行为,请将no_lflags_merge选项添加到CONFIG变量:

这样做的效果是,如果项目C依赖于库B,而库B又私有依赖于库A,但是C也想直接使用来自A的符号,它需要显式地链接到库A。换句话说,私有链接的库不会在构建时被传递。

指定生成Makefile时要使用的Makefile生成器的名称。这个变量的值通常由qmake在内部处理,很少需要修改。

这些变量由qmake在内部处理,不应该修改或使用。

指定应该放置所有中间moc文件的目录。

这类似于HEADERS变量,但是允许使用Objective-C++编译器编译生成的moc文件。

另请参阅OBJECTIVE_SOURCES

指定项目中所有Objective-C/C++源文件的名称。

这个变量现在已经废弃了,Objective-C/C++文件(.m和.mm)可以添加到SOURCES变量中。

另请参阅OBJECTIVE_HEADERS

这个变量是由SOURCES变量自动填充的。每个源文件的扩展名都被.o(Unix)或.obj(Win32)所代替。我们可以将对象添加到列表中

指定应该放置所有中间对象的目录。

这个列表位于所有内建(和$$PRE_TARGETDEPS)依赖项之后。

列出目标(target)所依赖的库。一些后端,例如VisualStudio和Xcode项目文件的生成器,不支持这个变量。通常,这些构建工具在内部支持这个变量,它对于显式列出依赖的静态库非常有用。

此列表放在所有内置依赖项之前

指示用于创建预编译头文件的头文件,以提高项目的编译速度。目前仅在某些平台上支持预编译头文件(Windows-所有MSVC项目类型、Apple-Xcode、Makefile、Unix-gcc3.3和更高版本)。

指向包含正在解析的当前文件的目录的完整路径。在编写项目文件以支持影子构建时,引用源树中的文件可能很有用。

另请参阅_PRO_FILE_PWD_

注意:不要试图覆盖此变量的值。

指向qmake放置生成的Makefile的目录的完整路径。

指定资源系统中的目录,在该目录中CONFIG+=embed_translations将使.qm文件可用。

默认值是:/i18n/

指定CONFIG+=lrelease生成的目标目录.qm文件将被安装到的位置。如果设置CONFIG+=embed_translations则没有任何效果

此变量仅供QtCreator使用。有关详细信息,请参见QtCreator:使用带有插件的QML模块。

指定qmake程序本身的名称,并将其放置在生成的Makefile中。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

包含生成Makefile时使用的qmake配置的完整路径的系统变量。这个变量的值是自动计算的。

注意:此变量仅在Unix平台上使用。

指定创建共享库时要执行的命令。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

注意:这个变量只在macOS、iOS、tvOS和watchOS上使用。

指定将与库包一起安装的数据,通常用于指定头文件集合。

例如,以下几行代码将path/to/header_one.h和path/to/header_two.h添加到一个包含框架提供的头信息的组:

1234FRAMEWORK_HEADERS.version=VersionsFRAMEWORK_HEADERS.files=path/to/header_one.hpath/to/header_two.hFRAMEWORK_HEADERS.path=HeadersQMAKE_BUNDLE_DATA+=FRAMEWORK_HEADERS最后一行将有关头文件的信息添加到将与库包一起安装的资源集合中。

在CONFIG变量中添加lib_bundle选项时创建库包。

指定要用于库包的扩展名。这允许使用自定义扩展来创建框架,而不是使用标准的.framework目录扩展名。

例如,下面的定义将产生一个扩展名为.myframework的框架:

指定用于构建项目的C编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。可以通过分别修改QMAKE_CFLAGS_DEBUG和QMAKE_CFLAGS_RELEASE变量来调整特定于调试和发布模式的标志。

为调试构建指定C编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

为发布构建指定C编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定CONFIG中设置force_debug_info的C编译器版本标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改

指定用于创建共享库的编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于创建多线程应用程序的编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

此变量仅在设置warn_offCONFIG选项时使用。这个变量的值通常由qmake或qmake.con处理,很少需要修改。

此变量仅在设置warn_onCONFIG选项时使用。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定要通过makeclean删除的,生成文件(例如,通过moc和uic生成的文件)和对象文件的列表。

指定在构建包含C++源代码的项目时将使用的C++编译器。在处理Makefile时,只要编译器可执行文件位于PATH变量中包含的路径上,就只需要指定该文件的文件名。

指定用于构建项目的C++编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。可以通过分别修改QMAKE_CXXFLAGS_DEBUG和QMAKE_CXXFLAGS_RELEASE变量来调整特定于调试和发布模式的标志。

指定用于调试构建的C++编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于发布构建的C++编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定CONFIG中设置force_debug_info的C++编译器版本标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改

指定用于创建共享库的C++编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于创建多线程应用程序的C++编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于抑制编译器警告的C++编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于生成编译器警告的C++编译器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

开发团队用于签名证书和配置配置文件的标识符。

指定要通过makedistclean删除的文件列表。

包含共享库的扩展。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

注意:更改扩展的特定于平台的变量会覆盖此变量的内容。

包含共享静态库的扩展。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

修改放置在包含的moc文件上的扩展名。另请参阅FileExtensions

修改用于QtDesignerUI文件的扩展名。另请参阅FileExtensions

修改用于创建的PRL文件的扩展名。另请参阅FileExtensions、LibraryDependencies

修改对给定给Lex的文件使用的扩展名。另请参阅FileExtensions、LEXSOURCES

修改对给定给Yacc的文件使用的扩展名。另请参阅FileExtensions、YACCSOURCES

修改用于生成的对象文件的扩展名。另请参阅FileExtensions

修改文件的后缀,这些后缀应该被解释为C++源代码。另请参阅FileExtensions

修改文件的后缀,这些后缀应该被解释为C头文件。另请参阅FileExtensions

指定附加编译器或预处理器的列表。另请参阅AddingCompilers

指定其他qmake目标的列表。另请参阅AddingCustomTargets

包含失败需求的列表。这个变量的值是由qmake设置的,不能修改。另请参阅requires()和REQUIRES

在框架项目中,此变量包含要用于构建框架的名称。

默认情况下,此变量包含与TARGET变量相同的值。

有关创建框架和库包的更多信息,请参见CreatingFrameworks

对于构建目标为macOS、iOS、tvOS或watchOS框架的项目,此变量用于指定将应用于所构建框架的版本号。

默认情况下,此变量包含与VERSION变量相同的值。

有关创建框架的更多信息,请参见CreatingFrameworks

提供有关运行qmake的主机的信息。例如,您可以从QMAKE_HOST.arch检索主机机器架构。

指定在使用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处理,很少需要修改。

指定在构建具有OpenVG支持的目标时要添加到INCLUDEPATH的OpenVG头文件的位置。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

如果OpenVG实现使用EGL,那么可能还需要设置QMAKE_INCDIR_EGL。

指定在构建X11目标时要添加到INCLUDEPATH的X11头文件路径的位置。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定要包含在macOS、iOS、tvOS和watchOS应用程序包中的属性列表文件.plist的名称。

注意:当使用Xcode生成器时,上面的${var}样式的占位符会被Xcode构建系统直接替换,qmake不会处理这些占位符。@var@样式的占位符只适用于qmakeMakefile生成器,而不适用于Xcode生成器。

如果为iOS构建,.plist文件包含NSPhotoLibraryUsageDescription键,那么qmake将在构建中包含一个额外的插件,用于添加照片访问支持(例如,QFile/QFileDialog)。关于这个键的更多信息,可以查看自苹果的Info.plist文档。

注意::大多数时候,默认Info.plist已经足够应付开发需要了。

注意:这个变量只在iOS上使用。

指定应用程序支持的iOS硬件的最小版本。

有关更多信息,请参见ExpressingSupportediOSVersions。

指定传递给链接器的通用标志集。如果需要更改用于特定平台或项目类型的标志,请使用其中一个专用变量,而不是此变量。

注意:这个变量只适用于Windows平台目标

指定用于构建控制台程序的链接器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定调试生成的链接器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于构建插件的链接器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定使用QMAKE_RPATHDIR中的值所需的链接器标志。

指定在QMAKE_RPATHDIR中启用相对路径所需的链接器标志。

指定动态链接器理解的字符串为引用可执行文件或库的位置。

指定使用QMAKE_RPATHLINKDIR中的值所需的链接器标志。

指定发布版本的链接器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定在CONFIG中设置force_debug_info的版本构建的链接器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于构建应用程序的链接器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于构建共享库的链接器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于设置共享对象(如.so或.dll)名称的链接器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于构建多线程项目的链接器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定用于构建WindowsGUI项目(即非控制台应用程序)的链接器标志。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定所有项目的库搜索路径列表。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

要在项目文件中指定额外的搜索路径,请像下面这样使用LIBS:

指定所有带-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可能也需要设置。

指定X11库目录的位置。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定每个项目需要链接到的其他库。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

要在项目文件中指定库,请使用LIBS。

指定每个项目需要链接到的其他私有库。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

要在库项目文件中指定私有库,请使用LIBS_PRIVATE。

在使用OpenGL/ES或OpenVG构建Qt时指定所有EGL库。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

其通常的值是-lEGL。

指定所有OpenGL库。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

这些变量指定了OpenGLES1和OpenGLES2的所有OpenGL库。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定所有OpenVG库。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。通常的值是-lOpenVG。

一些OpenVG引擎是在OpenGL上实现的。这将在配置时检测到,QMAKE_LIBS_OPENGL将隐式地添加到连接OpenVG库的QMAKE_LIBS_OPENVG中。

指定在构建多线程目标时需要链接的所有库。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定所有X11库。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

如果指定了lib模板,则此变量不是空的。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定在构建基于应用程序的项目时将使用的链接器。当处理Makefile时,只要链接器可执行文件位于PATH变量中包含的路径上,就只需要指定链接器可执行文件的文件名。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定创建到共享库的链接时要执行的命令。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

通过CONFIG+=lrelease启用时传递给lrelease的附加选项列表。

指定用于生成项目的目标C/C++编译器标记。除了QMAKE_CFLAGS和QMAKE_CXXFLAGS之外,还使用了这些标志。

指定将TARGET连接在一起后要执行的命令。该变量通常为空,因此不执行任何操作。

注意:这个变量对Xcode项目没有影响。

指定在连接TARGET之前要执行的命令。该变量通常为空,因此不执行任何操作。

注意:此变量仅用于VisualStudio项目文件。

在为IDE生成项目文件时确定项目的名称。默认值是目标名称。这个变量的值通常由qmake处理,很少需要修改。

有效配置配置文件的UUID。与QMAKE_DEVELOPMENT_TEAM一起使用,以指定配置配置文件。

注意:指定配置配置文件将禁用自动管理的签名。

在macOS上构建通用二进制文件时使用这个变量。

注意:这个变量只在macOS上使用。

指定应用程序支持的macOS的硬件最小版本。

更多信息,请参阅macOSVersionDependencies

指定要创建的生成文件的名称。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

包含qmake可执行文件的绝对路径。

注意:不要尝试重写此变量的值。

此变量用于自定义在使用它的每个构建规则中传递给ResourceCompiler的选项列表。例如,下面的行确保-threshold和-compress选项在每次调用rcc时使用特定的值:

指定在链接时添加到可执行文件中的库路径列表,以便在运行时优先搜索这些路径。

当指定了相对路径时,qmake将它们转换为动态链接器可以理解的相对于引用的可执行文件或库位置的形式。只有一些平台(目前是基于Linux和Darwin-based的平台)支持这一点,通过检查是否设置了QMAKE_REL_RPATH_BASE可以检测到。

指定静态链接器的库路径列表,以搜索共享库的隐式依赖关系。更多信息,请参见ld(1)的手册页

指定构建对象所需的单个规则。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

如果定义了该变量的值,则使用该变量的值作为一个路径,预先添加到构建的共享库的SONAME标识符中。SONAME是动态链接器稍后用于引用库的标识符。通常,该引用可以是库名或完整库路径。在macOS、iOS、tvOS和watchOS上,可以使用以下占位符相对指定路径:

在大多数情况下,使用@rpath就足够了,建议使用:

12#/project.proQMAKE_SONAME_PREFIX=@rpath但是,前缀也可以使用不同的占位符来指定,或者使用绝对路径,例如下面的路径之一:

1234#/project.proQMAKE_SONAME_PREFIX=@executable_path/../FrameworksQMAKE_SONAME_PREFIX=@loader_path/FrameworksQMAKE_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变量时,才会使用这个函数。

注意:此变量仅在tvOS平台上使用。

指定应用程序支持的tvOS的硬件最小版本。

此变量用于在使用它的每个构建规则中定制传递给UserInterfaceCompiler的选项列表。

注意:此变量仅在watchOS平台上使用。

指定应用程序支持的watchOS的硬件最小版本。

指定用于自动生成的QML类型注册的主版本。有关更多信息,请参见DefiningQMLTypesfromC++。

当自动注册C++中定义的QML类型时,使用这个次要版本注册模块的附加版本。通常,要注册的次要版本是从元对象推断出来的。

如果元对象没有改变,并且我们仍然想导入一个具有较新的副版本号的QML模块,那么我们可以使用这个变量。例如,MyModule元对象是1.1的,但是我们希望导入的模块是1.3的。

将QML_IMPORT_MAJOR_VERSION和QML_IMPORT_MINOR_VERSION指定为.版本字符串。

指定用于自动生成的QML类型注册的模块名称。有关更多信息,请参见DefiningQMLTypesfromC++。

指定在生成qmltypes文件时要考虑的元类型的JSON文件。当外部库提供向QML公开的类型(直接或作为其他类型的基类型或属性)时使用此属性。Qt类型将被自动考虑,不需要在这里添加。

指定项目使用的Qt模块。每个模块的添加值,请参阅模块文档。

在c++实现级别,使用Qt模块使其头文件可以被包含,并使其链接到二进制文件。

默认情况下,QT包含core和gui,确保无需进一步配置即可构建标准GUI应用程序。

如果我们想在不使用QtGUI模块的情况下构建一个项目,则需要使用“-=”操作符排除GUI值。下面的代码行将使我们能创建最小的Qt项目:

1QT-=gui#Onlythecoremoduleisused.如果我们的项目是一个QtDesigner插件,那么使用值uiplugin来指定要构建的项目是一个库,但是要有对QtDesigner的特定插件支持。有关更多信息,请参见BuildingandInstallingthePlugin。

指定要与应用程序链接的静态Qt插件的名称列表,以便它们作为内置资源可用。

qmake会自动添加所使用的Qt模块通常需要的插件(参见QT)。默认设置被调优为最佳的开箱即用体验。有关可用插件的列表和覆盖自动链接的方法,请参阅StaticPlugins。

当前,当链接共享/动态的Qt构建时,或者在链接库时,这个变量没有影响。它可以在以后用于部署动态插件。

包含Qt的当前版本。

包含Qt的当前主要版本。

包含Qt的当前次要版本。

包含Qt的当前补丁版本。

仅Windows平台使用。指定目标的Windows资源文件(.rc)的名称。参阅AddingWindowsResourceFiles。

仅Windows平台使用。指定应该在生成的.rc文件中指定的代码页。只有在设置了VERSION或RC_ICONS变量而没有设置RC_FILE和RES_FILE变量时,才会使用这个函数。

仅Windows平台使用。qmake将这个变量的值作为RC预处理器宏(/d选项)添加。如果未设置此变量,则使用DEFINES变量。

仅Windows平台使用。指定应该在生成的.rc文件中指定的语言。只有在设置了VERSION或RC_ICONS变量而没有设置RC_FILE和RES_FILE变量时,才会使用。

指定传递给Windows资源编译器的包含路径。

指定Qt资源编译器输出文件的目录。

注意:如果我们想在构建时跳过项目或子项目,建议使用requires()函数。

指定目标的资源集合文件(qrc)的名称。有关资源收集文件的更多信息,请参见Qt资源系统。

仅Windows平台使用。指定此目标的Windows资源编译器输出文件的名称。请参阅RC_FILE和添加Windows资源文件。

指定项目中所有源文件的名称。

123SOURCES=myclass.cpp\login.cpp\mainwindow.cpp也可参阅:HEADERS

当与subdirs模板一起使用时,此变量指定所有子目录或包含需要构建的项目部分的项目文件的名称。使用此变量指定的每个子目录必须包含其自己的项目文件。

建议每个子目录中的项目文件具有与子目录本身相同的基名称,因为这样可以省略文件名。例如,如果子目录名为myapp,则该目录中的项目文件应称为myapp.pro。

或者,我们可以在任何目录中指定.pro文件的相对路径。强烈建议只指定当前项目的父目录或子目录中的路径。

123SUBDIRS+=my_executablemy_librarytestsdocmy_executable.depends=my_librarytests.depends=my_executable上面的配置确保在my_executable之前构建my_library,在tests之前构建my_executable。但是,doc可以与其他子目录并行构建,从而加快构建过程。

注意:可以列出多个依赖项,它们都将在依赖于它们的目标之前构建。

注意:不建议使用CONFIG+=ordered,因为它会降低多核构建的速度。此设置下,与上面的示例不同的是,即使没有依赖关系,所有的构建也会按顺序进行。

除了定义构建顺序,还可以通过给SUBDIRS元素额外的修饰符来修改SUBDIRS的默认行为。支持修饰符是:

例如,定义两个子目录,这两个都在不同的目录下的SUBDIRS值,其中一个子目录必须在另一个之前建立:

123TEMPLATE=appTARGET=myappSOURCES=main.cpp上面的项目文件将在unix上生成名为myapp的可执行文件,在Windows上生成名为myapp.exe的可执行文件。

指定TARGET的扩展名。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

用主版本号指定TARGET的扩展名。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

使用版本号指定TARGET的扩展名。这个变量的值通常由qmake或qmake.conf处理,很少需要修改。

指定生成项目时要使用的模板名称。允许的值是:

|选项|描述||app|创建用于构建应用程序的Makefile(缺省值)。有关更多信息,请参见BuildinganApplication。||lib|创建用于构建库的Makefile。有关更多信息,请参见BuildingaLibrary。||subdirs|创建用于在子目录中构建目标的Makefile。子目录是使用SUBDIRS变量指定的。||aux|创建一个不构建任何东西的Makefile。如果不需要调用编译器来创建目标,请使用此选项;例如,因为我们的项目是用解释语言编写的。注意:此模板类型仅适用于基于makefile的生成器。特别是,它不能与vcxproj和Xcode生成器一起工作。||vcapp|仅Windows使用。为VisualStudio创建一个应用程序项目。有关更多信息,请参见CreatingVisualStudioProjectFiles。||vclib|仅Windows使用。为VisualStudio创建一个库项目。|

指定翻译(.ts)文件列表,其中包含将用户界面文本翻译成非本地语言的内容。

TRANSLATIONS中的翻译文件将由lrelease和lupdate工具处理。如果只希望lrelease处理文件,请使用EXTRA_TRANSLATIONS。

我们可以使用CONFIG+=lrelease在构建过程中自动编译文件,并使用CONFIG+=lreleaseembed_translations使它们在Qt资源系统中可用。

有关Qt的国际化(i18n)和本地化(l10n)的更多信息,请参见QtLinguistManual。

指定应该放置uic的所有中间文件的目录。

如果指定了libtemplate,则指定库的副版本号。

如果指定了libtemplate,则指定库的补丁版本号。

告诉qmake在哪里搜索无法打开的文件。例如,如果qmake查找SOURCES,并发现一个无法打开的条目,它会查看整个VPATH列表,看看是否能自己找到该文件。

也可以参阅DEPENDPATH。

指定目标Windows版本;这对应于vcxproj文件中的标签WindowsTargetPlatformVersion。

在桌面Windows中,默认值是环境变量WindowsSDKVersion的值。

在UniversalWindowsPlatform(UWP)上,默认值是环境变量UCRTVERSION的值。

指定Windows目标平台的最小版本;这对应于vcxproj文件中的标签WindowsTargetPlatformMinVersion。

默认为WINDOWS_TARGET_PLATFORM_VERSION。

指定要传递到UWP上的应用程序清单的参数。允许的值是:

我们可以使用这些值的任何组合。

1234WINRT_MANIFEST.publisher=MyCompanyWINRT_MANIFEST.logo_store=someImage.pngWINRT_MANIFEST.capabilities+=internetClientWINRT_MANIFEST.capabilities_device+=location另外,可以使用WINRT_MANIFEST指定输入清单文件。

1WINRT_MANIFEST=someManifest.xml.in如果不处理输入清单文件,而只是将其复制到目标目录,则需要设置逐字配置。

例如,下面一行将项目文件的位置打印到控制台:

1message($$_PRO_FILE_)注意:不要尝试重写此变量的值。

包含到包含正在使用的项目文件的目录的路径。

例如,下面一行将把包含项目文件的目录的位置打印到控制台:

1message($$_PRO_FILE_PWD_)注意:不要尝试重写此变量的值。

qmake提供了在配置过程中处理变量内容的函数。这些函数称为替换函数。通常,它们返回可以分配给其他变量的值。可以通过在函数前面加上$$操作符来获得这些值。替换函数可以分为内置函数和函数库。

也可参阅测试函数

基本替换函数被实现为内置函数。

返回path的绝对路径。

如果没有指定base,则使用当前目录作为起始目录。如果是相对路径,则在使用前相对于当前目录进行解析。

例如,下面的调用返回字符串“/home/toby/myproject/readme.txt“:

1message($$absolute_path("readme.txt","/home/toby/myproject"))这个函数是在Qt5.0中引入的。

也可参阅clean_path()和relative_path()。

返回在variablename中指定的文件的基本名称。

返回目录分隔符规范化(转换为”/“)、删除冗余分隔符并且”.“和”..“都被(尽可能地)处理了的path。这个函数是对QDir::cleanPath的封装。

这个函数是在Qt5.0中引入的。

也可参阅absolute_path(),relative_path(),shell_path(),system_path()

返回指定file的目录名部分。例如:

接受任意数量的参数。它为每个参数展开转义序列\n、\r、\t,并以列表的形式返回参数。

注意:如果按字面意思指定要展开的字符串,则需要对反斜杠进行转义,如下面的代码片段所示:

12345MY_VAR=onetwothreefourMY_VAR2=$$join(MY_VAR,"-L",-L)-LfiveMY_VAR3=$$member(MY_VAR,3)$$find(MY_VAR,t.*)message($$MY_VAR2)message($$MY_VAR3)上面示例的输出:

返回variablename的第一个值。

例如,以下调用返回firstname:

12CONTACT=firstnamemiddlenamesurnamephonemessage($$first(CONTACT))也可参阅take_first(),last().

以options指定的格式返回number。我们可以指定以下选项:

目前不支持浮点数。

例如,下面的调用将十六进制数字BAD转换为002989:

1message($$format_number(BAD,ibase=16width=6zeropad))这个函数是在Qt5.0中引入的。

将filename当做一个qmake项目文件,并返回分配给variablename的值。

也可参阅infile()

返回环境变量variablename的值。这基本上等同于$$(variablename)语法。但是,getenv函数支持名称中带有圆括号的环境变量。

将variablename和glue的值连接起来。如果这个值不是空的,这个函数会在这个值前面加上before和在后面加上after。variablename是唯一必须的字段,其他字段默认为空字符串。如果需要在glue、before或after中对空格进行编码,则必须引用它们。

返回variablename的最后一个值。

例如,以下调用返回phone:

12CONTACT=firstnamemiddlenamesurnamephonemessage($$last(CONTACT))也可参阅take_last(),first()

接受任意数量的参数。它创建一个唯一命名的变量,该变量包含参数列表,并返回该变量的名称。可以使用该变量编写循环,如下面的代码片段所示:

也可参阅upper()

返回variablename列表中的值,可以使用start指定零开始的元素索引,使用end指定结束元素的索引(该函数会包含start和end元素)。

如果start未指定,则使用其默认值0,此时该函数的功能相当于$$first(variablename)。

如果end未指定,则其默认值将与start相等,此用法表示简单的数组索引,因为将只返回一个元素。

也可以在单个参数中指定开始和结束,数字由两个句点分隔。

负数表示从列表末尾开始的索引,而-1是最后一个元素。

如果任一索引范围越界,则返回空列表。

如果end小于start,则按相反顺序返回元素。

注意:结束(end)索引是包含的和无序的,这意味着只有当索引无效时(即输入变量为空时)才会返回一个空列表。

也可参阅str_member()

接受任意数量的数值参数并将它们相加,返回和。

可以隐式支持减法,因为可以简单地在数值前加一个减号来对其进行取负值:

1sum=$$num_add($$first,-$$second)如果操作数可能已经是负数,则需要执行另一个额外的步骤来规范化数字:

123second_neg=-$$secondsecond_neg~=s/^--//sum=$$num_add($$first,$$second_neg)这个函数是在Qt5.8中引入的。

显示指定的question,并返回从stdin读取的值。

如果decorate为true(缺省值),question将获得一个通用的前缀和后缀,将其标识为提示符。

将整个string转换为单个实体并返回结果。这只是将字符串括在双引号中的一种特殊方式。

用反斜杠转义的每个特殊正则表达式字符返回string。这个函数是QRegExp::escape的包装器。

返回目录树tree中的注册表项key的值。

仅支持目录HKEY_CURRENT_USER(HKCU)和HKEY_LOCAL_MACHINE(HKLM)

1flag`的值可以是`WOW64_32KEY(32)`或`WOW64_64KEY(64)注意:此功能仅在Windows主机上可用。

这个函数是在Qt5.12.1中引入的。

返回filePath相对于base的路径。

如果未指定base,则为当前项目目录。如果是相对的,则在使用前相对于当前项目目录进行解析。

如果filePath是相对的,它首先根据基本目录解析;在这种情况下,此函数实际上充当$$clean_path()。

也可参见absolute_path(),clean_path()

用string提供的变量内容中的new_string替换old_string的每个实例。例如,代码:

12MESSAGE=Thisisatent.message($$replace(MESSAGE,tent,test))输出:

以相反顺序返回variablename的值。

返回值variablename的一部分。这个函数是QString::section的包装器。

例如,下面的调用输出surname:

将path中的所有目录分隔符转换为与构建项目时使用的shell(即由make工具调用的shell)兼容的分隔符。例如,当使用Windowsshell时,斜杠将转换为反斜杠。

也可参阅system_path()

为构建项目时使用的shell引用arg。

也可参阅system_quote()

返回variablename的值的数目。

也可参阅str_size()

这是一个我们通常不需要的内部功能。

返回variablename中的值列表,其中项按ASCII升序排序。

在format_number()函数的帮助下,可以通过将值零填充到固定长度来完成数字排序。

这个函数是在Qt5.8中引入的。

将variablename的值分割为单独的值,并以列表的形式返回它们。这个函数是QString::split的包装器。

这个函数与member()相同,只是它操作的是字符串值而不是列表变量,因此索引引用字符位置。

这个函数可以用来实现许多常见的字符串切片操作:

1234567891011121314#$$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为0的参数需要单独处理。

也可参阅member(),num_add().

返回参数中的字符数。

也可参阅size().

我们可以使用system函数的这个变体从命令中获取stdout,并将其分配给一个变量。

12UNAME=$$system(uname-s)contains(UNAME,[lL]inux):message(ThislookslikeLinux($$UNAME)tome)与$$cat()类似,mode参数将blob、lines、true和false作为值。但是,传统的分词规则(如empty和true或false)略有不同。

如果传递stsvar,命令的退出状态将存储在该变量中。如果命令崩溃,状态将为-1,否则为该命令选择的非负退出代码。通常,将状态与零(成功)进行比较就足够了。

请参阅system()的测试变体。

将path中的所有目录分隔符转换为与system()函数用于调用命令的shell兼容的分隔符。例如,在Windowsshell中将斜杠转换为反斜杠。

也可参阅shell_path()

为system()函数使用的shell引用arg。

也可参阅shell_quote()

返回variablename的第一个值,并将其从源变量中删除。

例如,这为实现队列提供了便利。

也可参阅take_last(),first().

返回variablename的最后一个值,并将其从源变量中删除。

例如,这为实现堆栈提供了便利。

也可参阅take_first(),last().

返回variablename中删除重复条目的值列表。例如:

也可参阅lower()

转义variablename的值,使其能够解析为qmake代码。

测试函数返回一个布尔值,我们可以在范围的条件部分测试该值。测试函数可以分为内置函数和函数库。

也可参阅替换函数()

基本测试函数被实现为内置函数。

1cache(variablename,[set|add|sub][transient][super|stash],[sourcevariablename])这是一个我们通常不需要的内部功能。

这个函数可以用来测试CONFIG()变量中的变量。这与scopes相同,但是有一个额外的优点,即可以传递第二个参数来测试活动配置。由于值的顺序在CONFIG变量中很重要(也就是说,最后一组值将被认为是互斥值的活动配置),第二个参数可以用来指定一组要考虑的值。例如:

1234CONFIG=debugCONFIG+=releaseCONFIG(release,debug|release):message(Releasebuild!)#willprintCONFIG(debug,debug|release):message(Debugbuild!)#noprint因为release被认为是活动设置(用于特性解析),所以它将是用来生成构建文件的配置。在常见情况下,不需要第二个参数,但对于特定的互斥测试来说,它是很重要的。

如果变量variablename包含value值,则成功;否则失败。可以为参数value指定一个正则表达式。

我们可以使用范围检查此函数的返回值。

如果变量variablename包含指定number值的列表,则成功;否则失败。

测试是否定义了函数或变量name。如果type被省略,则检查所有功能。若要只检查变量或特定类型的函数,请指定type。它可以有以下值:

测试variablename是否等于字符串value。

测试具有给定filename的文件是否存在。如果该文件存在,则函数成功;否则失败。如果为filename指定了正则表达式,如果有任何文件与指定的正则表达式匹配,则此函数成功。

将variablename的当前值从函数的本地上下文导出到全局上下文。

开始循环,遍历list中的所有值,依次将iterate设置为每个列表中的值。方便起见,如果list为1…10然后iterate将遍历从1到10的值。

123VALUE=123TMP_VALUE=x$$VALUEgreaterThan(TMP_VALUE,x456):message("Conditionmaybetrue.")也可参阅lessThan()

评估condition。它用于对布尔表达式进行分组。

我们可以使用此函数作为作用域的条件来检查是否包含该文件。例如:

这是CONFIG函数的别名。

如果变量variablename为空,则成功;否则失败。这相当于count(variablename,0)。

测试variablename的值小于value。工作机制类似于greaterThan()。

在控制台上打印一条消息。与message函数不同,它既不添加文本也不添加换行符。

也可参阅message().

总是成功,并将string作为一条通用消息显示给用户。与error()函数不同,此函数允许继续处理。

1message("Thisisamessage")上面的行会将“Thisisamessage”写入控制台。使用引号是可选的,但建议使用。

注意:默认情况下,将为qmake为给定项目生成的每个Makefile写入消息。如果我们想确保每个项目的消息只出现一次,那么测试build_pass变量与一个范围,以便在构建期间过滤掉消息。例如:

评估condition。如果条件为假,qmake在构建时跳过这个项目(及其子目录)。

注意:也可以为此使用REQUIRES变量。但是,我们建议使用此函数。

在二级shell中执行给定的command。如果命令以零退出状态返回,则成功;否则失败。我们可以使用范围检查此函数的返回值。

1system("ls/bin"):HAS_BIN=TRUE也可参见system()的替换变量。

从当前上下文中删除variablename。

这个函数是在Qt5.10中引入的。

测试来自variablename的版本号是否小于或等于versionNumber。工作机制类似versionAtLeast().

总是成功,并将string作为警告消息显示给用户。

将variablename的值写入名为filename的文件,每个值在单独的行上。如果没有指定variablename,则创建一个空文件。如果mode是append并且该文件已经存在,则追加而不是替换它。

复杂的测试函数是在.prf文件库中实现的。

使用PKGCONFIG机制来确定在项目解析时给定的包是否存在。

这对于可选地启用或禁用特性非常有用。例如:

123TEMPLATE=subdirsSUBDIRS=onetwothreeprepareRecursiveTarget(check)在.CONFIG中指定have_no_default或no__target的子目录将被排除在这个目标之外:

1two.CONFIG+=no_check_target我们必须手动将准备好的目标添加到QMAKE_EXTRA_TARGETS:

1QMAKE_EXTRA_TARGETS+=check为了使目标全局化,上面的代码需要包含到每个subdirs子项目中。另外,为了让这些目标做任何事情,非subdirs子项目需要包含各自的代码。实现这一点最简单的方法是创建一个自定义特性文件。例如:

12#/.qmake.confCONFIG+=mycheck这个函数是在Qt5.0中引入的。

构建测试项目。如果测试通过,则返回true并将config_添加到配置变量中。否则,返回false。

要使此功能可用,我们需要加载相应的功能文件:

12#/project.proload(configure)这还将变量QMAKE_CONFIG_TESTS_DIR设置为项目父目录的config.tests子目录。可以在加载特性文件后覆盖此值。

在测试目录中,每个测试必须有一个子目录,其中包含一个简单的qmake项目。下面的代码片段说明了项目的.pro文件:

1234#/config.tests/test/test.proSOURCES=main.cppLIBS+=-ltheFeature#NotethatthetestprojectisbuiltwithoutQtbydefault.下面的代码片段演示了项目的main.cpp文件:

12#/project.proqtCompileTest(test)如果测试项目成功构建,则测试通过。

测试结果被自动缓存,这也使得它们对所有子项目可用。因此,建议在顶级项目文件中运行所有配置测试。

要避免缓存结果的重用,请将CONFIG+=recheck传递给qmake。

也可参阅load()

检查name指定的Qt模块是否存在。有关可能值的列表,请参见QT。

THE END
1.119号元素有多恐怖(119号元素中文名)导读目前关于大家提出的119号元素有多恐怖这个问题,那么小编今天就去收集了一些119号元素中文名相关的内容来分享给大家。1、然而,这一元素的存在似乎与现有的理论存在矛盾。2、119号元素,被称 目前关于大家提出的119号元素有多恐怖这个问题,那么小编今天就去收集了一些119号元素中文名相关的内容来分享给大家。 https://www.00rr.com/xinwen/202411/373082.html
2.初中化学元素符号顺口溜和记忆口诀及初中化学说课汇编开场白:各位评委好,我是XXX号考生,今天我说课题目是《空气》这一课题的第一部分《空气是由什么组成的》,下面开始我的说课,根据新课标理论我将以教什么,怎样教,为什么这样教为设计思路,从教材分析,学情分析,教学目标,教学重难点等几个方面进行说明,首先说一下我对教材的认识。 一、说教材 《空气》是新人教版九https://m.360docs.net/doc/d98537523.html
3.济源市十四届人大四次会议建议第001号 关于有序开发利用温泉资源的建议 随着人们生活水平的不断提高,旅游业已经成为促进经济发展的朝阳产业,我市也提出了“一山一水一精神”的旅游发展理念。在五龙口镇辖区内有我国大陆水温最高、水质最好的的医用地热矿泉,含有30多种矿物质和微量元素,且温泉水储量丰富,泉水最高温度101度,最低温度76.8度,地热http://www.jyrdcwh.gov.cn/site/src/pages/themeeting/themeeting.html?id=741
4.元素周期表是否有尽头?探寻神秘的“119号”元素探寻神秘的“119号”元素 虽然锂及其化合物能够治疗许多疾病,但是过多服用锂及其化合物会引起中枢神经系统中毒和肾脏衰竭,中毒的前驱表现是迟钝、倦怠、昏睡、肌肉抽搐、语词不清、食欲降低以及吐泻等。对于锂中毒还没有特效解毒药,主要的治疗措施是保持呼吸通畅,防止呼吸道感染。尚未发现锂中毒成瘾的情况,停止服锂药后https://wiki.antpedia.com/article-3137846-180
5.科学家最近发现了第119号元素,中文名居然是……119号元素 名称:钞 符号: ¥、$ 稀有金属, 易挥发, 难形成。 放在钱包里极其不稳定, 燃点低, 在双十一的催化作用下, 挥发尤其迅速。 密封于银行卡, 溶于女人等物质, 溶解后迅速转化成快递。 见光会变色, 由红渐变成 绿色,橙黄色,蓝灰色,紫色, https://m.sohu.com/news/a/206476383_99938974
6.110~119号超重元素以俄罗斯物理学家尤里·奥加涅相命名。 第118号元素?是人类合成的最重元素。 119号元素——类钫 119号元素(符号Uue)是尚未合成的元素。 美国、德国和俄罗斯的团队多次尝试都 失败了. 119号元素可能是技术可以合成 的最后两个元素之一( 119号和120号 )。https://www.meipian.cn/54rdmjkk
7.games.sina.com.cn/zhuanqu/helbreath/info/1.shtml第1号 团队名称:rewrewr 队伍介绍: werwerewr 战场宣言:werwrwerwer 提交时间:2002-5-10 18:17:44 第2号 团队名称:rewrewrwerwe 队伍介绍: werwerewrwerwer 战场宣言:werwrwerwerwerwerwr 提交时间:2002-5-10 18:18:9 第3号 团队名称:angeler https://games.sina.com.cn/zhuanqu/helbreath/info/1.shtml
8.科学网—新方法让120号元素触手可及如果科学家成功合成119号和120号元素,元素周期表将增加第八行。图片来源:Dinendra Haria 本报讯近日,在美国伊利诺伊州举行的“核结构2024”会议上,研究人员展示了一种制造超重元素——120号元素的新方法,这将是迄今为止最重的元素。 美国劳伦斯·伯克利国家实验室的研究人员7月23日宣布,他们首次利用钛束制造出一种https://news.sciencenet.cn/sbhtmlnews/2024/7/380505.shtm
9.Python程序设计题库——第三章20. Python内置函数___用来返回序列中的最小元素。 答案:min() 21. Python内置函数___用来返回数值型序列中所有元素之和。 答案:sum() 解析:python119. 已知x={1:2,2:3},那么表达式x.get(2,4)的值为___。 答案:3 120. 表达式{1,2,3} | {3,4,5}的值为___。 答案:{1, 2, 3,https://m.nowcoder.com/discuss/353149722133209088
10.PHP/Javascript/CSS/jQuery常用知识大全详细整理php技巧又叫做单态模式、单元素模式、singleton pattern。单例模式指在PHP的应用程序的范围内只对指定的类创建一个实例。使用单例模式的类称为单例类。在php中单例类必须要有一个私有的构造方法,还要有一个私有的魔术克隆方法(该方法体中为空)和一个私有的静态的成员属性$_instance.私有构造方法防止除自身以外的类来实例https://www.jb51.net/article/33065_all.htm
11.content/兼容性问题.md·徐奕裕/webinterview问题说明:当父元素设置 position:relative; 时,在 ie6 中第一个 ul、ol、dl 的背景颜色失效 解决方法: ul、ol、dl 都设置为 position:relative; 参与119. url encoding 问题说明:一般 FF 无法识别 js 中的& 解决方法:在 js 中如果书写 url 就直接写&不要写& 120. nodeName 和 tagName 问题 问题https://api.gitee.com/xuyiyuA/web-interview/blob/master/content/%E5%85%BC%E5%AE%B9%E6%80%A7%E9%97%AE%E9%A2%98.md
12.TSPDT电影史最伟大250名导演《对话》则是他电影的第二部重量级作品,运探讨了现代媒介并不能准确反映事物真实性以及还原事件的全貌,人所能看到的往往都是狭隘的带着臆想的自我暗示所生成的符合心理预期的主观加工过的结果,这种预期的悖反说明了认识的片面性以及技术的局限性,反转结局的荒诞感表达了对科技的担忧与对人的质疑。可以视作是一次对https://www.douban.com/note/671694973/
13.Scala基础119.view(切片开始元素位置,切片结束元素位置) 120.withFilter 121.zip 122.zipAll 123.zipWithIndex 一、Scala简介 Scala源自Java,构建在JVM之上,与Java兼容、互通。 Scala的优势: 1.多范式编程: (1)面向对象编程: 每个值都是对象; 对象的数据类型和行为由类(Class)和特征(Trait,类似于interface)描述; https://blog.csdn.net/Helen_1997_1997/article/details/129567810
14.西门子S7300编程问题大全<4>119:关于机架故障,在编程OB86时需要注意哪些事项? 只要检测出机架故障,操作系统就会调用OB86,例如:报告机架故障(例如:缺少IM或IM故障导致连接电缆中断), 机架的分布式电源故障, 在总线系统PROFIBUS-DP的主站系统中,DP从站发生故障。 在S7-300和S7-400中处理故障的方法不同: 在S7-300中,当中央机架出现故障时,不http://trackyuanhang.lofter.com/post/13b4f3_f794159