qmake 手册

qmake 手册:

qtHaveModule(printsupport): QT += printsupport 
qtHaveModule(opengl): QT += opengl  

qmake工具有助于简化跨不同平台的开发项目的构建过程。它自动生成Makefile,因此创建每个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。你应该有这样的东西:
如果您更喜欢使用类似Make的语法,一次列出所有文件,您可以使用换行符进行转义,如下所示:

 SOURCES = hello.cpp \
           main.cpp

既然源文件已列在项目文件中,就必须添加头文件。这些文件的添加方式与源文件完全相同,只是我们使用的变量名是HEADERS。

 HEADERS += hello.h
 SOURCES += hello.cpp
 SOURCES += main.cpp

目标名称是自动设置的。它与项目文件名相同,但后缀适用于平台。例如,如果项目文件名为hello.pro,则目标在Windows上为hello.exe,在Unix上为hello。如果要使用其他名称,可以在项目文件中设置该名称:

现在,您可以使用qmake为应用程序生成Makefile。在命令行上的项目目录中,键入以下内容:

 qmake -o Makefile hello.pro

然后根据使用的编译器键入make或nmake。对于Visual Studio用户,qmake还可以生成Visual Studio项目文件。例如:

 qmake -tp vc hello.pro

应用程序的发布版本不包含任何调试符号或其他调试信息。在开发过程中,生成具有相关信息的应用程序的调试版本非常有用。这可以通过将调试添加到项目文件中的CONFIG变量中轻松实现。
像以前一样使用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。
如果文件不存在,则停止qmake.
如果某个文件不存在,您可能不想创建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来生成生成文件。如果临时重命名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在每个项目文件中查找特定的变量,并使用这些变量的内容来确定应该向Makefile写入什么。例如,HEADERS和SOURCES变量中的值列表用于告诉qmake与项目文件位于同一目录中的头文件和源文件。
变量也可以在内部用于存储临时值列表,并且可以用新值覆盖或扩展现有的值列表。
以下代码段说明了如何将值列表分配给变量:

 HEADERS = mainwindow.h paintwidget.h

变量中的值列表以以下方式扩展:

 SOURCES = main.cpp mainwindow.cpp \
           paintwidget.cpp
 CONFIG += console

注意:第一个赋值只包括与HEADERS变量在同一行指定的值。第二个赋值使用反斜杠(\)将SOURCES变量中的值在行间拆分。CONFIG变量是qmake在生成Makefile时使用的另一个特殊变量。一般配置中对此进行了讨论。在上面的代码段中,控制台被添加到CONFIG中包含的现有值的列表中。
下表列出了一些常用的变量,并描述了它们的内容。有关变量及其描述的完整列表,请参见变量。

变量内容
CONFIG常规项目配置选项。
DESTDIR可执行文件或二进制文件所在的目录。
FORMS要由用户界面编译器(uic)处理的UI文件的列表。
HEADERS生成项目时使用的头文件(.h)的文件名列表。
RESOURCES要包含在最终项目中的资源(.qrc)文件的列表。有关这些文件的更多信息,请参阅Qt资源系统。
SOURCES生成项目时要使用的源代码文件的列表。
TEMPLATE用于项目的模板。这决定了构建过程的输出是应用程序、库还是插件。

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

 TEMP_SOURCES = $$SOURCES

$$运算符广泛用于对字符串和值列表进行操作的内置函数。有关更多信息,请参阅qmake Language。
空白通常,空白分隔变量赋值中的值。若要指定包含空格的值,必须将这些值用双引号括起来:

 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.

要在变量赋值中包含#字符,必须使用内置LIERAL_HASH变量的内容。

内置功能和控制流程:

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

 include(other.pro)

通过作用域提供对条件结构的支持,作用域的行为类似于编程语言中的if语句:

 win32 {
     SOURCES += paintwidget_win.cpp
 }

只有当条件为true时,才会在大括号内进行赋值。在这种情况下,必须设置win32 CONFIG选项。这在Windows上自动发生。大括号必须与条件位于同一条线上。

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

TEMPLATE变量用于定义将要生成的项目的类型。如果这没有在项目文件中声明,qmake会假设应该构建一个应用程序,并为此生成一个适当的Makefile(或等效文件)。

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

模板qmake 输出
app生成文件以生成应用程序。
lib生成文件以构建库。
aux生成文件以不生成任何内容。如果不需要调用编译器来创建目标,例如因为您的项目是用解释语言编写的,请使用此选项。注意:此模板类型仅适用于基于Makefile的生成器。特别是,它将不适用于vcxproj和Xcode生成器。
subdirs生成包含使用SUBDIRS变量指定的子目录规则的文件。每个子目录都必须包含自己的项目文件。
vcapp用于生成应用程序的Visual Studio项目文件。
vclib用于生成库的Visual Studio项目文件。
vcsubdirs用于在子目录中生成项目的Visual Studio解决方案文件。

有关为使用应用程序和库模板的项目编写项目文件的建议,请参阅构建通用项目类型。
当使用子目录模板时,qmake会生成一个Makefile来检查每个指定的子目录,处理在那里找到的任何项目文件,并在新创建的Makefile上运行平台的make工具。SUBDIRS变量用于包含要处理的所有子目录的列表。

CONFIG变量指定项目应配置的选项和功能。
项目可以在发布模式或调试模式下生成,也可以同时在两者中生成。如果同时指定了调试和发布,则最后一个会生效。如果指定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.)
 }

这使得可以为发布和调试版本定义不同的配置。有关详细信息,请参阅使用作用域。
以下选项定义了要生成的项目的类型。
注:其中一些选项仅在相关平台上使用时生效。

OptionDescription
qt该项目是一个Qt应用程序,应该与Qt库链接。您可以使用QT变量来控制应用程序所需的任何其他QT模块。默认情况下会添加此值,但您可以将其删除以将qmake用于非Qt项目。
x11该项目是一个X11应用程序或库。如果目标使用Qt,则不需要此值。

应用程序和库项目模板为您提供了更专业的配置选项,以微调构建过程。这些选项在“建筑常见项目类型”中有详细说明。
例如,如果您的应用程序使用Qt库,并且您希望在调试模式下构建它,那么您的项目文件将包含以下行:

 CONFIG += qt debug

声明库:
如果CONFIG变量包含qt值,则qmake将启用对qt应用程序的支持。这样就可以微调应用程序使用的Qt模块。这是通过QT变量实现的,该变量可用于声明所需的扩展模块。例如,我们可以通过以下方式启用XML和网络模块:

 QT += network xml

注意:QT默认情况下包括核心模块和gui模块,因此上面的声明将网络模块和XML模块添加到此默认列表中。以下赋值省略了默认模块,并且在编译应用程序的源代码时会导致错误:

 QT = network xml # This will omit the core and gui modules.

如果您想构建一个没有gui模块的项目,则需要使用“-=”运算符将其排除在外。默认情况下,QT同时包含core和gui,因此以下行将生成一个最小的QT项目:

 QT -= gui # Only the core module is used.

有关可以添加到Qt变量的Qt模块列表,请参阅Qt。

配置功能:

qmake可以使用功能(.prf)文件中指定的额外配置功能进行设置。这些额外的功能通常为构建过程中使用的自定义工具提供支持。要将要素添加到构建过程中,请将要素名称(要素文件名的词干)附加到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项目文件:应用程序、库和插件。尽管所有项目类型都使用许多相同的变量,但每种类型都使用特定于项目的变量来自定义输出文件。
此处不描述特定于平台的变量。有关更多信息,请参阅Qt For Windows-Deployment和Qt For macOS。
构建应用程序应用程序模板告诉qmake生成一个将构建应用程序的Makefile。使用此模板,可以通过在CONFIG变量定义中添加以下选项之一来指定应用程序的类型:

选项说明
Windows该应用程序是一个Windows GUI应用程序。
consoleap该应用程序是一个Windows控制台应用程序。
testcase该应用程序是一个自动测试。

使用此模板时,将识别以下qmake系统变量。您应该在.pro文件中使用这些来指定有关应用程序的信息。有关其他依赖于平台的系统变量,您可以查看平台说明。

  • HEADERS-应用程序的头文件列表。
  • SOURCES-应用程序的C++源文件列表。
  • FORMS-应用程序的UI文件列表(使用Qt Designer创建)。
  • LEXSOURCES-应用程序的Lex源文件列表。
  • YACCSOURCES-应用程序的Yacc源文件列表。
  • TARGET—应用程序的可执行文件的名称。这默认为项目文件的名称。(如果有扩展,则会自动添加)。
  • DESTDIR-目标可执行文件所在的目录。
  • 定义-应用程序所需的任何附加预处理器定义的列表。
  • INCLUDEPATH-应用程序所需的任何其他包含路径的列表。
  • DEPENDPATH-应用程序的依赖项搜索路径。
  • VPATH-用于查找提供的文件的搜索路径。
  • DEF_FILE-仅限Windows:应用程序要链接的.DEF文件。

您只需要使用具有值的系统变量。例如,如果没有任何额外的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变量,任何应用程序都可以标记为testcase。
对于测试用例项目,qmake将在生成的Makefile中插入一个检查目标。此目标将运行应用程序。如果测试以等于零的退出代码终止,则认为该测试通过。
检查目标会自动在SUBDIRS项目中重复出现。这意味着可以从SUBDIRS项目中发出make-check命令来运行整个测试套件。
检查目标的执行可以通过某些Makefile变量来定制。这些变量是:

VariableDescription
TESTRUNNERA命令或为每个测试命令准备的shell片段。一个示例用例是一个“超时”脚本,如果测试没有在指定时间内完成,它将终止测试。
TESTARGS附加到每个测试命令的附加参数。例如,传递额外的参数来设置测试的输出文件和格式(例如-o文件名,QTestLib支持的格式选项)可能很有用。

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

#通过测试包装器运行测试,并使用xunitxml输出格式。
#在本例中,测试包装器是一个虚构的包装器脚本,它终止
#如果未在“--timeout”设置的秒数内完成测试。
#“-o result.xml,xunitxml”选项由QTestLib解释。
make-check TESTRUNNER=“测试包装器--timeout 120”TESTARGS=“-o result.xml,xunitxml”

可以使用以下CONFIG选项进一步自定义测试用例项目:

选项描述
significant_test在进行检查时将忽略测试的退出代码。

测试用例通常使用QTest或TestCase编写,但这不是使用CONFIG+=TestCase并进行检查的要求。唯一的主要要求是测试程序在成功时使用零退出代码退出,而在失败时使用非零退出代码。

构建库
lib模板告诉qmake生成一个生成库的Makefile。使用此模板时,除了应用程序模板支持的系统变量外,还支持VERSION变量。使用.pro文件中的变量来指定有关库的信息。
使用lib模板时,可以将以下选项添加到CONFIG变量中,以确定构建的库的类型:

OptionDescription
dllThe library is a shared library (dll).
staticlibThe library is a static library.
pluginThe library is a plugin.

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

  • VERSION-目标库的版本号。例如,2.3.1。

库的目标文件名依赖于平台。例如,在X11、macOS和iOS上,库名称将以lib为前缀。在Windows上,不会在文件名中添加前缀。

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

  • VERSION-目标库的版本号。例如,2.3.1。

构建Qt设计器插件Qt Designer插件是使用一组特定的配置设置构建的,这些设置取决于为您的系统配置Qt的方式。为了方便起见,可以通过将设计器添加到QT变量来启用这些设置。例如:

 QT          += widgets designer

有关基于插件的项目的更多示例,请参阅Qt设计器示例。
在调试和发布模式下构建和安装有时,
有必要在调试和发行模式下构建项目。尽管CONFIG变量可以同时包含调试和发布选项,但仅应用最后指定的选项。
在两种模式下
构建要使项目能够在两种方式下构建,必须将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上使用与Unix平台上使用的约定不同的约定来命名:

 CONFIG(debug, debug|release) {
     mac: TARGET = $$join(TARGET,,,_debug)
     win32: TARGET = $$join(TARGET,,d)
 }

上面代码段中的默认行为是在调试模式下生成时修改用于生成目标的名称。可以向作用域中添加else子句,以便对发布模式执行同样的操作。保持原样,目标名称保持不变

运行qmake

qmake的行为可以在运行时通过在命令行上指定各种选项进行自定义。这些允许对构建过程进行微调,提供有用的诊断信息,并可用于指定项目的目标平台。
用于运行qmake的语法采用以下简单形式:

 qmake [mode] [options] files

操作模式
qmake支持两种不同的操作模式。在默认模式下,qmake使用项目文件中的信息生成Makefile,但也可以使用qmake生成项目文件。如果要显式设置模式,则必须先指定该模式,然后再指定所有其他选项。模式可以是以下两个值之一:

-makefile  qmake output will be a Makefile.
-project  qmake output will be a project file.注意:创建的文件可能需要进行编辑。例如,添加QT变量以适应项目所需的模块。

您可以使用这些选项来指定常规设置和特定于模式的设置。仅适用于生成文件模式的选项在“生成文件模式选项”部分中进行了说明,而影响项目文件创建的选项在项目模式选项部分中进行说明。

files参数表示一个或多个项目文件的列表,用空格分隔。
一般操作:
可以在qmake的命令行上指定一系列选项,以便自定义构建过程,并覆盖平台的默认设置。以下基本选项提供了有关使用qmake的帮助,指定qmake写入输出文件的位置,并控制将写入控制台的调试信息的级别:

-helpqmake将介绍这些功能,并提供一些有用的帮助。
-o文件qmake输出将定向到文件。如果未指定此选项,qmake将根据其运行的模式,尝试为其输出使用合适的文件名。如果指定了“-”,则输出将定向到stdout。
-d qmake将输出调试信息。多次添加-d会增加冗长性。

项目使用的模板通常由项目文件中的template变量指定。您可以使用以下选项替代或修改此选项:
-t tmpl qmake将使用tmpl覆盖任何设置的TEMPLATE变量,但仅在.pro文件已处理之后。
-tp前缀qmake将为TEMPLATE变量添加前缀。

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

-Wall qmake 将报告所有已知警告。
-Wnone qmake 不会生成任何警告信息。
-Wparser qmake 只会生成解析器警告。这将提醒您项目文件解析中的常见陷阱和潜在问题。
-Wlogic qmake 将警告项目文件中的常见陷阱和潜在问题。例如,qmake将报告列表中多次出现的文件和丢失的文件。

Makefile 模式选项

qmake -makefile [options] files

在Makefile模式下,qmake将生成一个用于构建项目的Makefile。此外,以下选项可用于此模式,以影响项目文件的生成方式:

-afterqmake将处理在指定文件之后的命令行中给出的赋值。
-nocache qmake将忽略.qmake.cache文件。
-nodepend qmake不会生成任何依赖关系信息。
-缓存文件qmake将使用file作为缓存文件,忽略找到的任何其他.qmake.cache文件。
-spec-spec qmake将使用spec作为平台和编译器信息的路径,并忽略QMAKESPEC的值。

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

qmake -makefile -o Makefile “CONFIG+=test” test.pro
但是,一些指定的选项可以省略,因为它们是默认值:
如果确定要在指定的文件之后处理变量,则可以传递-after选项。如果指定了此选项,则在-after选项之后的命令行上的所有分配都将推迟到解析指定文件之后。

项目模式选项 qmake -project [options] files
在项目模式下,qmake将生成一个项目文件。此外,您可以在此模式下提供以下选项:
-r qmake将递归地查找提供的目录。
-n opwd-qmake不会在当前工作目录中查找源代码。它将只使用指定的文件。

在这种模式下,files参数可以是文件或目录的列表。如果指定了一个目录,它将包含在DEPENDPATH变量中,并且其中的相关代码将包含在生成的项目文件中。如果给定了一个文件,它将被附加到正确的变量,这取决于它的扩展名。例如,将UI文件添加到FORMS,将C++文件添加到SOURCES。
在此模式下,您也可以在命令行上传递指定。执行此操作时,这些工作分配将最后放置在生成的项目文件中。

平台备忘录

许多跨平台项目都可以通过基本的qmake配置特性来处理。然而,在某些平台上,利用特定于平台的功能有时是有用的,甚至是必要的。qmake了解其中许多功能,可以通过特定变量访问这些功能,这些变量仅在相关平台上生效。
这些平台特有的功能包括支持创建通用二进制文件、框架和捆绑包。

源程序包中提供的qmake版本与二进制程序包中的版本配置略有不同,因为它使用了不同的功能规范。在源包通常使用macx-g++规范的情况下,二进制包通常配置为使用macx-xcode规范。
每个包的用户都可以通过使用-spec选项调用qmake来覆盖此配置(有关更多信息,请参阅运行qmake)。例如,要使用二进制包中的qmake在项目目录中创建Makefile,请调用以下命令: qmake -spec macx-g++

qmake能够自动生成针对macOS上标准框架目录中的框架进行链接的构建规则,该目录位于/Library/frameworks/。
需要在构建系统中指定标准框架目录以外的目录,这是通过将链接器选项附加到LIBS变量来实现的,如以下示例所示: LIBS += -F/path/to/framework/directory/

框架本身是通过将-framework选项和框架名称附加到LIBS变量来链接的: LIBS += -framework TheFramework

任何给定的库项目都可以进行配置,以便将生成的库文件放置在框架中,以便进行部署。要做到这一点,请将项目设置为使用lib模板,并将lib_bundle选项添加到CONFIG变量中:

 TEMPLATE = lib
 CONFIG += lib_bundle

与库关联的数据是使用QMAKE_UNDLE_data变量指定的。它包含将与库捆绑包一起安装的项目,通常用于指定头文件的集合,如以下示例所示:

qmake 语言

许多qmake项目文件使用名称=值和名称+=值定义的列表,简单地描述了项目使用的源文件和头文件。qmake还提供了可用于处理变量声明中提供的信息的其他运算符、函数和作用域。这些高级功能允许从单个项目文件为多个平台生成Makefile。

操作

在许多项目文件中,assign(=)和append(+=)运算符可用于包含有关项目的所有信息。典型的使用模式是为变量分配一个值列表,并根据各种测试的结果附加更多的值。由于qmake使用默认值定义某些变量,因此有时需要使用remove(-=)运算符来筛选出不需要的值。以下部分介绍如何使用运算符来操作变量的内容。

赋值

 TARGET = myapp

附加值

DEFINES += USE_MY_STUFF

删除值

 DEFINES -= USE_MY_STUFF

添加唯一值

DEFINES*=USE_MY_STUFF

替换值

 DEFINES ~= s/QT_[DT].+/QT

在上一行中,列表中以QT_D或QT_T开头的任何值都将替换为QT。

变量展开:$$

 EVERYTHING = $$SOURCES $$HEADERS
 message("The project contains the following files:")
 message($$EVERYTHING)

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

 DESTDIR = $$(PWD)
 message(The project will be installed in $$DESTDIR)

在上面的赋值中,当项目文件被处理时,PWD的值被立即读取,但$(PWD)在生成的Makefile中被赋值给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])

该运营商可访问的属性通常用于使第三方插件和组件能够集成在Qt中。例如,如果在Qt Designer的项目文件中进行了以下声明,则可以将Qt Designer插件与Qt Designer内置插件一起安装:

 target.path = $$[QT_INSTALL_PLUGINS]/designer
 INSTALLS += target

作用域:
作用域语法:作用域由一个条件、同一行上的左大括号、一系列命令和定义以及新行上的右大括号组成:

 <condition> {
     <command or definition>
     ...
 }

左大括号必须与条件写在同一行。作用域可以连接为包括多个条件,如以下各节所述。

作用域可以嵌套以组合多个条件。例如,要仅在启用调试的情况下包含特定平台的特定文件,请编写以下内容:

 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运算符,将许多条件连接在一起,并要求所有条件都为true。
还有一个|运算符,其作用类似于逻辑OR运算符,将许多条件连接在一起,并且只要求其中一个条件为真。

 win32|macx {
     HEADERS += debugging.h
 }

您还可以通过使用else作用域为作用域内的声明提供替代声明。如果前面作用域的条件为false,则处理其他每个作用域。这允许您在与其他作用域(如上所述用:运算符分隔)组合时编写复杂的测试。例如:

 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
 }

由于可以将自己的值放在CONFIG行上,这为您提供了一种方便的方法来自定义项目文件并微调生成的Makefile。

平台范围值
除了在许多作用域条件中使用的win32、macx和unix值之外,还可以使用作用域测试各种其他内置平台和编译器特定的值。这些是基于Qt的mkspecs目录中提供的平台规范。例如,项目文件中的以下几行显示了linux-g++规范的当前使用和测试规范:

 message($$QMAKESPEC)

 linux-g++ {
     message(Linux)
 }

自定义变量:

 MY_VARIABLE = value

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

 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文件中的自定义函数和定义的集合,这些文件可以位于许多标准目录中的一个目录中。这些目录的位置定义在多个位置,qmake在查找.prf文件时按以下顺序检查每个目录:

使用预编译头

配置qmake

参考

变量

替换函数

内置替换功能

测试函数

内置测试函数
测试函数库

预编译标头

在大型项目中,可以利用预编译的头文件来加快构建过程。有关详细信息,请参见使用预编译标头。

现在,您可以使用qmake为应用程序生成Makefile。在命令行的项目目录中,键入以下内容

 qmake -o Makefile hello.pro
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值