qmake手册(Qt5.9.3)

2022-08-31 15:45:41 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

qmake手册

  • qmake手册
  • 概观
    • 描述一个项目
    • 建立一个项目
    • 使用第三方库
    • 预编译头文件
  • 入门
    • 从简单的开始
    • 使应用程序可调试
    • 添加平台特定的源文件
    • 如果文件不存在停止qmake
    • 检查多个条件
  • 创建项目文件
    • 项目文件元素
      • 变量
      • 注释
      • 内置的功能和控制流程
    • 项目模板
    • 一般配置
    • 声明Qt库
    • 配置功能
    • 声明其他库
  • 构建通用项目类型
    • 建立应用程序
    • 建立一个测试用例
    • 建立一个库
    • 建立一个插件
      • 构建一个Qt设计器插件
    • 在Debug和Release模式下构建和安装
      • 建立在这两种模式
  • 运行qmake
    • 命令语法
    • 操作模式
    • 文件
    • 常规选项
    • Makefile模式选项
    • 项目模式选项
  • 平台注释
    • macOSiOStvOS和watchOS
      • 源代码和二进制包
      • 使用框架
      • 创建框架
      • 创建和移动Xcode项目
      • 同时支持两个构建目标
    • Windows
      • 添加Windows资源文件
      • 创建Visual Studio项目文件
      • Visual Studio清单文件
  • qmake语言
    • 操作
      • 分配值
      • 附加值
      • 删除值
      • 添加唯一值
      • 替换值
      • 变量扩展
      • 访问qmake属性
    • 作用域
      • 范围语法
      • 范围和条件
      • 配置和范围
      • 平台范围值
    • 变量
    • 替换函数
    • 测试功能
  • 高级用法
    • 添加新的配置功能
    • 安装文件
    • 添加自定义目标
    • 添加编译器
    • 库依赖关系
  • 使用预编译头
    • 将预编译的头添加到您的项目
    • 项目选项
    • 示例项目
  • 配置qmake
    • 属性
    • QMAKESPEC
    • 缓存文件
    • 文件扩展名
  • 参考
    • 变量引用
    • 函数参考
  • 变量
    • CONFIG
    • DEFINES
    • DEF_FILE
    • DEPENDPATH
    • DESTDIR
    • DISTFILES
    • DLLDESTDIR
    • FORMS
    • GUID
    • HEADERS
    • ICON
    • IDLSOURCES
    • INCLUDEPATH
    • INSTALLS
    • LEXIMPLS
    • LEXOBJECTS
    • LEXSOURCES
    • LIBS
    • LITERAL_HASH
    • MAKEFILE
    • MAKEFILE_GENERATOR
    • MSVCPROJ_
    • MOC_DIR
    • OBJECTS
    • OBJECTS_DIR
    • POST_TARGETDEPS
    • PRE_TARGETDEPS
    • PRECOMPILED_HEADER
    • PWD
    • OUT_PWD
    • QMAKE
    • QMAKESPEC
    • QMAKE_AR_CMD
    • QMAKE_BUNDLE_DATA
    • QMAKE_BUNDLE_EXTENSION
    • QMAKE_CC
    • QMAKE_CFLAGS
    • QMAKE_CFLAGS_DEBUG
    • QMAKE_CFLAGS_RELEASE
    • QMAKE_CFLAGS_SHLIB
    • QMAKE_CFLAGS_THREAD
    • QMAKE_CFLAGS_WARN_OFF
    • QMAKE_CFLAGS_WARN_ON
    • QMAKE_CLEAN
    • QMAKE_CXX
    • QMAKE_CXXFLAGS
    • QMAKE_CXXFLAGS_DEBUG
    • QMAKE_CXXFLAGS_RELEASE
    • QMAKE_CXXFLAGS_SHLIB
    • QMAKE_CXXFLAGS_THREAD
    • QMAKE_CXXFLAGS_WARN_OFF
    • QMAKE_CXXFLAGS_WARN_ON
    • QMAKE_DEVELOPMENT_TEAM
    • QMAKE_DISTCLEAN
    • QMAKE_EXTENSION_SHLIB
    • QMAKE_EXTENSION_STATICLIB
    • QMAKE_EXT_MOC
    • QMAKE_EXT_UI
    • QMAKE_EXT_PRL
    • QMAKE_EXT_LEX
    • QMAKE_EXT_YACC
    • QMAKE_EXT_OBJ
    • QMAKE_EXT_CPP
    • QMAKE_EXT_H
    • QMAKE_EXTRA_COMPILERS
    • QMAKE_EXTRA_TARGETS
    • QMAKE_FAILED_REQUIREMENTS
    • QMAKE_FRAMEWORK_BUNDLE_NAME
    • QMAKE_FRAMEWORK_VERSION
    • QMAKE_HOST
    • QMAKE_INCDIR
    • QMAKE_INCDIR_EGL
    • QMAKE_INCDIR_OPENGL
    • QMAKE_INCDIR_OPENGL_ES2
    • QMAKE_INCDIR_OPENVG
    • QMAKE_INCDIR_X11
    • QMAKE_INFO_PLIST
    • QMAKE_IOS_DEPLOYMENT_TARGET
    • QMAKE_LFLAGS
    • QMAKE_LFLAGS_CONSOLE
    • QMAKE_LFLAGS_DEBUG
    • QMAKE_LFLAGS_PLUGIN
    • QMAKE_LFLAGS_RPATH
    • QMAKE_LFLAGS_REL_RPATH
    • QMAKE_REL_RPATH_BASE
    • QMAKE_LFLAGS_RPATHLINK
    • QMAKE_LFLAGS_RELEASE
    • QMAKE_LFLAGS_APP
    • QMAKE_LFLAGS_SHLIB
    • QMAKE_LFLAGS_SONAME
    • QMAKE_LFLAGS_THREAD
    • QMAKE_LFLAGS_WINDOWS
    • QMAKE_LIBDIR
    • QMAKE_LIBDIR_FLAGS
    • QMAKE_LIBDIR_EGL
    • QMAKE_LIBDIR_OPENGL
    • QMAKE_LIBDIR_OPENVG
    • QMAKE_LIBDIR_X11
    • QMAKE_LIBS
    • QMAKE_LIBS_EGL
    • QMAKE_LIBS_OPENGL
    • QMAKE_LIBS_OPENVG
    • QMAKE_LIBS_THREAD
    • QMAKE_LIBS_X11
    • QMAKE_LIB_FLAG
    • QMAKE_LINK
    • QMAKE_LINK_SHLIB_CMD
    • QMAKE_LN_SHLIB
    • QMAKE_OBJECTIVE_CFLAGS
    • QMAKE_POST_LINK
    • QMAKE_PRE_LINK
    • QMAKE_PROJECT_NAME
    • QMAKE_PROVISIONING_PROFILE
    • QMAKE_MAC_SDK
    • QMAKE_MACOSX_DEPLOYMENT_TARGET
    • QMAKE_MAKEFILE
    • QMAKE_QMAKE
    • QMAKE_RESOURCE_FLAGS
    • QMAKE_RPATHDIR
    • QMAKE_RPATHLINKDIR
    • QMAKE_RUN_CC
    • QMAKE_RUN_CC_IMP
    • QMAKE_RUN_CXX
    • QMAKE_RUN_CXX_IMP
    • QMAKE_SONAME_PREFIX
    • QMAKE_TARGET
    • QMAKE_TARGET_COMPANY
    • QMAKE_TARGET_DESCRIPTION
    • QMAKE_TARGET_COPYRIGHT
    • QMAKE_TARGET_PRODUCT
    • QMAKE_TVOS_DEPLOYMENT_TARGET
    • QMAKE_WATCHOS_DEPLOYMENT_TARGET
    • QT
    • QTPLUGIN
    • QT_VERSION
    • QT_MAJOR_VERSION
    • QT_MINOR_VERSION
    • QT_PATCH_VERSION
    • RC_FILE
    • RC_CODEPAGE
    • RC_DEFINES
    • RC_ICONS
    • RC_LANG
    • RC_INCLUDEPATH
    • RCC_DIR
    • REQUIRES
    • RESOURCES
    • RES_FILE
    • SUBDIRS
    • TARGET_EXT
    • TARGET_x
    • TARGET_xyz
    • TEMPLATE
    • TRANSLATIONS
    • UI_DIR
    • VERSION
    • VERSION_PE_HEADER
    • VER_MAJ
    • VER_MIN
    • VER_PAT
    • VPATH
    • WINRT_MANIFEST
    • YACCSOURCES
    • _PRO_FILE_
    • _PRO_FILE_PWD_
  • 替换函数
    • 内置替换功能
      • absolute_pathpath base
      • basenamevariablename
      • catfilename mode
      • clean_pathpath
      • dirnamefile
      • enumerate_vars
      • escape_expandarg1 arg2 argn
      • findvariablename substr
      • filespattern recursivefalse
      • firstvariablename
      • format_numbernumber options
      • fromfilefilename variablename
      • getenvvariablename
      • joinvariablename glue before after
      • lastvariablename
      • listarg1 arg2 argn
      • lowerarg1 arg2 argn
      • membervariablename start end
      • num_addarg1 arg2 argn
      • promptquestion decorate
      • quotestring
      • re_escapestring
      • relative_pathfilePath basen
      • replacestring old_string new_string
      • sprintfstring arguments
      • resolve_dependsvariablename prefix
      • reversevariablename
      • sectionvariablename separator begin end
      • shadowedpath
      • shell_pathpath
      • shell_quotearg
      • sizevariablename
      • sort_dependsvariablename prefix
      • sortedvariablename
      • splitvariablename separator
      • str_memberarg start end
      • str_sizearg
      • systemcommand mode stsvar
      • system_pathpath
      • system_quotearg
      • take_firstvariablename
      • take_lastvariablename
      • uniquevariablename
      • upperarg1 arg2 argn
      • val_escapevariablename
  • 测试功能
    • 内置的测试功能
      • cachevariablename setaddsubtransientsuperstash source variablename
      • CONFIG配置
      • containsvariablename value
      • countvariablename number
      • debuglevel message
      • definedname type
      • equalsvariablename value
      • errorstring
      • evalstring
      • existsfilename
      • exportvariablename
      • foriterate list
      • greaterThanvariablename value
      • fcondition
      • includefilename
      • infilefilename var val
      • isActiveConfig
      • isEmptyvariablename
      • isEqual
      • lessThanvariablename value
      • loadfeature
      • logmessage
      • messagestring
      • mkpathdirPath
      • requirescondition
      • systemcommand
      • touchfilename reference_filename
      • unsetvariablename
      • warningstring
      • write_filefilename variablename mode
    • Test Function Library
      • packagesExistpackages
      • prepareRecursiveTargettarget
      • qtCompileTesttest
      • qtHaveModulename

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的更多详细信息。

从简单的开始

假设您刚刚完成了应用程序的基本实现,并且已经创建了以下文件:

  • hello.cpp
  • hello.h
  • main.cpp

您将在Qt发行版的examples/qmake/tutorial目录中找到这些文件。关于应用程序设置的唯一的另外一件事是它是用Qt编写的。首先,使用您最喜欢的纯文本编辑器,在examples/qmake/tutorial中创建一个名为hello.pro的文件。你需要做的第一件事是添加行,告诉qmake关于作为开发项目一部分的源文件和头文件。

我们将首先将源文件添加到项目文件中。要做到这一点,你需要使用SOURCES变量。只需用SOURCES =开始一个新行,然后放入hello.cpp。你应该有这样的东西:

代码语言:javascript复制
SOURCES   = hello.cpp

我们重复这个项目中的每个源文件,直到我们结束如下:

代码语言:javascript复制
SOURCES   = hello.cpp
SOURCES   = main.cpp

如果你喜欢使用Make-like的语法,把所有的文件意义出来,你可以像下面这样使用换行符:

代码语言:javascript复制
SOURCES = hello.cpp 
          main.cpp

现在源文件已经列在项目文件中了,头文件必须被添加。除了我们使用的变量名是HEADERS之外,这些都以与源文件完全相同的方式添加。

一旦你完成了这个,你的项目文件应该是这样的:

代码语言:javascript复制
HEADERS   = hello.h
SOURCES   = hello.cpp
SOURCES   = main.cpp

目标名称是自动设置的。它与项目文件名相同,但具有适合该平台的后缀。例如,如果项目文件名为hello.pro,则目标将是Windows上的hello.exe和Unix上的hello。如果你想使用不同的名字,你可以在项目文件中设置它:

代码语言:javascript复制
TARGET = helloworld

完成的项目文件应该是这样的:

代码语言:javascript复制
HEADERS   = hello.h
SOURCES   = hello.cpp
SOURCES   = main.cpp

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

代码语言:javascript复制
qmake -o Makefile hello.pro

然后根据你使用的编译器输入make或者nmake

对于Visual Studio用户,qmake也可以生成Visual Studio项目文件。例如:

代码语言:javascript复制
qmake -tp vc hello.pro

使应用程序可调试

应用程序的发行版本不包含任何调试符号或其他调试信息。在开发过程中,生成具有相关信息的应用程序的调试版本很有用。通过在项目文件中添加调试到CONFIG变量可以轻松实现。 例如:

代码语言:javascript复制
CONFIG    =  debug
HEADERS   = hello.h
SOURCES   = hello.cpp
SOURCES   = main.cpp

像以前一样使用qmake来生成一个Makefile。在调试环境中运行应用程序时,您将获得有关您的应用程序的有用信息。

添加平台特定的源文件

经过几个小时的编码之后,您可能已经开始了应用程序的平台特定部分,并决定将平台相关代码分开。所以你现在有两个新的文件包含到你的项目文件中:hellowin.cpphellounix.cpp。我们不能把这些添加到SOURCES变量中,因为这会将两个文件放在Makefile中。所以,我们需要做的是使用一个范围,这个范围将根据我们正在构建的平台来处理。

添加Windows平台相关文件的简单范围如下所示:

代码语言:javascript复制
win32 {
    SOURCES   = hellowin.cpp
}

当为Windows构建时,qmake将hellowin.cpp添加到源文件列表中。当为任何其他平台建设,qmake`只是忽略它。现在剩下要做的就是为Unix专用文件创建一个范围。

当你这样做的时候,你的项目文件应该是这样的:

代码语言:javascript复制
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的文件如下所示:

代码语言:javascript复制
!exists(main.cpp){
    error("No main.cpp file found")
}

!符号用于否定测试。也就是说,如果文件存在,exists(main.cpp)true,如果文件不存在,则存在!exists(main.cpp)true

代码语言:javascript复制
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行,把这个设置包含在WindowsMakefile中。但是,假设我们只想在Windows上运行时添加CONFIG行,并且已经在CONFIG行上进行了调试。这需要使用两个嵌套的作用域。首先创建一个范围,然后在其中创建另一个范围。把设置放在第二个范围内处理,像这样:

代码语言:javascript复制
win32 {
    debug{
        CONFIG    = console
    }
}

嵌套的作用域可以使用冒号连接在一起,所以最终的工程文件如下所示:

代码语言:javascript复制
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。例如,HEADERSSOURCES变量中的值列表用于告诉qmake关于项目文件所在目录中的头文件和源文件。

变量也可以在内部用于存储临时值列表,现有的值列表可以用新值覆盖或扩展。 以下片段说明了如何将值列表分配给变量:

代码语言:javascript复制
HEADERS = mainwindow.h paintwidget.h

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

代码语言:javascript复制
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

用于该项目的模板。这决定了构建过程的输出是一个应用程序,一个库还是一个插件。

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

代码语言:javascript复制
TEMP_SOURCES = $$SOURCES

$$操作符广泛地用于对字符串和值列表进行操作的内置函数。有关更多信息,请参阅qmake语言

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

代码语言:javascript复制
DEST = "Program Files"

引用的文本在变量所保存的值列表中被视为单个项目。类似的方法用于处理包含空格的路径,特别是在为Windows平台定义INCLUDEPATHLIBS变量时:

代码语言:javascript复制
win32:INCLUDEPATH  = "C:/mylibs/extra headers"
unix:INCLUDEPATH  = "/home/user/extra headers"

注释

您可以项目文件中添加注释。注释以字符开始并继续到同一行的末尾。例如:

代码语言:javascript复制
# 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函数最常用于包含其他项目文件:

代码语言:javascript复制
include(other.pro)

对条件结构的支持可以通过在编程语言中像if语句那样工作的作用域来实现:

代码语言:javascript复制
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解决方案文件在子目录中生成项目。

有关编写使applib模板的项目的项目文件的建议,请参阅构建常用项目类型

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

一般配置

CONFIG变量指定了项目应该配置的选项和功能。 该项目可以建立在release模式或debug模式下,或两者兼有。如果指定了debugrelease,则最后一个生效。如果您指定debug_and_release选项来构建项目的调试版本和发行版本,则qmake生成的Makefile将包含一个构建这两个版本的规则。这可以通过以下方式调用:

代码语言:javascript复制
make all

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

注意CONFIG变量中指定的每个选项也可以用于作用域的条件。您可以使用内置的CONFIG()函数来测试是否存在某些配置选项。例如,下面几行显示的函数是作用域中的条件,用于测试是否只有opengl选项正在使用:

代码语言:javascript复制
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模式构建它,那么您的项目文件将包含以下行:

代码语言:javascript复制
CONFIG  = qt debug

注意:您必须使用" =",而不是"="qmake

声明Qt库

如果CONFIG变量包含qt值,则启用qmake对Qt应用程序的支持。这样可以调整应用程序使用哪个Qt模块。这是通过QT变量来实现的,它可以用来声明所需的扩展模块。例如,我们可以通过以下方式启用xmlnetwork模块:

代码语言:javascript复制
QT  = network xml

注意:QT默认包含coregui模块,所以上面的声明将networkxml模块添加到这个默认列表中。以下分配省略了默认模块,并且在编译应用程序源代码时会导致错误:

代码语言:javascript复制
QT = network xml # This will omit the core and gui modules.

如果你想建立一个没有gui模块的项目,你需要用"-="运算符来排除它。默认情况下,QT同时包含coregui,所以下面的代码会产生一个最小的Qt项目:

代码语言:javascript复制
QT -= gui # Only the core module is used.

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

配置功能

可以使用配置文件(.prf)指定额外功能来设置qmake。这些额外的功能通常为构建过程中使用的自定义工具提供支持。要为构建过程添加功能,请将功能名称附加到CONFIG变量。 例如,qmake可以配置构建过程,以利用pkg-config支持的外部库(如D-Busogg库),其中包含以下几行:

代码语言:javascript复制
CONFIG      = link_pkgconfig
PKGCONFIG   = ogg dbus-1

有关添加功能的更多信息,请参阅添加新的配置功能。

声明其他库

如果您在项目中使用其他库,除了Qt提供的库之外,您需要在项目文件中指定它们。 qmake搜索库的路径和链接的特定库可以添加到LIBS变量中的值列表中。您可以指定库的路径,或使用Unix风格的表示法来指定库和路径。 例如,以下几行显示了如何指定一个库:

代码语言:javascript复制
LIBS  = -L/usr/local/lib -lmath

包含头文件的路径也可以使用INCLUDEPATH变量以类似的方式指定。 例如,要添加几个要搜索头文件的路径:

代码语言:javascript复制
INCLUDEPATH = c:/msdev/include d:/stl/include

构建通用项目类型

本章介绍如何为基于Qt的三种常见项目类型设置qmake项目文件:applicationlibraryplugin。虽然所有项目类型都使用许多相同的变量,但是每个项目都使用项目特定的变量来自定义输出文件。 这里不介绍平台特定的变量。有关更多信息,请参阅 Qt for Windows – Deployment and Qt for macOS

建立应用程序

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

选项

描述

windows

该应用程序是一个Windows GUI应用程序。

console

仅限应用程序模板:应用程序是Windows控制台应用程序。

testcase

该应用程序是一个自动测试。

使用这个模板时,以下的qmake系统变量被识别。您应该在.pro文件中使用这些文件来指定有关您的应用程序的信息。对于额外的平台相关的系统变量,您可以查看平台注释。

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

你只需要使用你需要的系统变量。例如,如果你没有任何额外的INCLUDEPATH,那么你不需要指定任何。 qmake将添加必要的默认值。示例项目文件可能如下所示:

代码语言:javascript复制
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变量:

代码语言:javascript复制
# 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

该库是一个插件。

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

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

库的目标文件名是平台相关的。例如,在X11macOSiOS上,库名称将以lib为前缀。在Windows上,没有前缀被添加到文件名称。

建立一个插件

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

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

构建一个Qt设计器插件

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

代码语言:javascript复制
QT  = widgets designer

有关基于插件的项目的更多示例,请参阅Qt Designer示例。

在Debug和Release模式下构建和安装

有时候,有必要在调试和发布模式下建立一个项目。虽然CONFIG变量可以同时包含debug和release选项,但只应用最后指定的选项。

建立在这两种模式

要在两种模式下建立项目,您必须将debug_and_release选项添加到CONFIG变量中:

代码语言:javascript复制
CONFIG  = debug_and_release
CONFIG(debug, debug|release) {
    TARGET = debug_binary
} else {
    TARGET = release_binary
}

上面代码片段作用域中修改了每种模式下的构建目标,以确保生成的目标具有不同的名称。为目标提供不同的名称可确保不会覆盖另一个名称。

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

代码语言:javascript复制
make all

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

代码语言:javascript复制
CONFIG   = build_all

这允许使用默认规则处理Makefile

代码语言:javascript复制
make

在两种模式下安装 build_all选项还可确保在调用安装规则时安装两个版本的目标:

代码语言:javascript复制
make install

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

代码语言:javascript复制
CONFIG(debug, debug|release) {
    mac: TARGET = $$join(TARGET,,,_debug)
  	win32: TARGET = $$join(TARGET,,d)
}

上述片段中的缺省行为是在debug模式下构建时修改用于构建目标的名称。可以将一个else子句添加到作用域中,以对发布模式执行相同的操作。保持原样,目标名称保持不变。

运行qmake

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

命令语法

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

代码语言:javascript复制
qmake [mode] [options] files

操作模式

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

  • -makefile qmake输出将是一个Makefile。
    • -project 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会报告多个文件列表中的文件和丢失的文件。

Makefile模式选项

代码语言:javascript复制
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

代码语言:javascript复制
qmake -makefile -o Makefile "CONFIG =test" test.pro

但是,某些指定的选项可以省略,因为它们是默认值:

代码语言:javascript复制
qmake "CONFIG =test" test.pro

如果您确定您希望在指定的文件之后处理变量,则可以传递-after选项。指定此选项时,-after选项之后的命令行上的所有分配都将被推迟,直到解析指定的文件为止。

项目模式选项

代码语言:javascript复制
qmake -project [options] files

在项目模式下,qmake会生成一个项目文件。另外,您可以在此模式下提供以下选项:

  • -r qmake会递归地查看提供的目录。
  • -nopwd qmake不会在您的当前工作目录中查找源代码。它只会使用指定的文件。

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

平台注释

许多跨平台的项目可以通过基本的qmake配置功能来处理。但是,在某些平台上,有时甚至有必要利用特定于平台的功能。 qmake知道许多这些功能,可以通过特定的变量进行访问,这些变量只会在相关的平台上生效。

macOSiOStvOSwatchOS

特定于这些平台的功能包括支持创建通用二进制文件,框架和捆绑软件。

源代码和二进制包

源代码包中提供的qmake版本与二进制包中提供的版本稍有不同,因为它使用了不同的功能规范。在源代码包通常使用macx-g 规范的情况下,二进制包通常被配置为使用macx-xcode规范。

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

代码语言:javascript复制
qmake -spec macx-g  

使用框架

qmake能够自动生成构建规则,用于链接到位于/Library/Frameworks/的macOS上的标准框架目录中的框架。

需要将标准框架目录以外的目录指定给构建系统,这可以通过在LIBS变量中附加链接器选项来实现,如以下示例所示:

代码语言:javascript复制
LIBS  = -F/path/to/framework/directory/

框架本身通过在LIBS变量中附加-framework选项和框架的名称来链接:

代码语言:javascript复制
LIBS   = -framework TheFramework

创建框架

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

代码语言:javascript复制
TEMPLATE = lib
CONFIG   = lib_bundle

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

代码语言:javascript复制
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_NAMEQMAKE_FRAMEWORK_VERSION变量指定。默认情况下,用于这些变量的值是从TARGETVERSION变量中获得的。 有关部署应用程序和库的更多信息,请参阅Qt for macOS – Deployment

创建和移动Xcode项目

macOS上的开发人员可以利用QmakeXcode项目文件的支持,如Qt for macOS文档中所述。通过运行qmake从现有的qmake项目文件生成一个Xcode项目。例如:

代码语言:javascript复制
qmake -spec macx-xcode project.pro

注意:如果稍后在磁盘上移动项目,则必须再次运行qmake来处理项目文件并创建新的Xcode项目文件。

同时支持两个构建目标

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

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

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

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

Windows

特定于此平台的功能包括对Windows资源文件(提供的或自动生成的)的支持,创建Visual Studio项目文件和部署使用Visual Studio 2005开发的Qt应用程序时处理清单文件。

添加Windows资源文件

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

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

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

通过设置至少一个系统变量VERSIONRC_ICONS来触发由qmake自动生成适当填充的.rc文件。生成的.rc文件自动编译并链接。添加到.rc文件中的元素由系统变量QMAKE_TARGET_COMPANYQMAKE_TARGET_DESCRIPTIONQMAKE_TARGET_COPYRIGHTQMAKE_TARGET_PRODUCTRC_CODEPAGERC_ICONSRC_LANGVERSION定义。

如果这些元素是不够的,qmake有两个系统变量RC_FILERES_FILE,直接指向一个外部创建的.rc.res文件。通过设置这些变量之一,指定的文件链接到EXEDLL注意:如果设置了RC_FILERES_FILE,则qmake生成的.rc文件被阻塞。在这种情况下,qmake不会对给定的.rc文件或.res.o文件做进一步的修改;与.rc文件生成有关的变量不起作用。

创建Visual Studio项目文件

本节介绍如何将现有的qmake项目导入到Visual Studio中。 qmake能够获取项目文件并创建一个Visual Studio项目,其中包含开发环境所需的所有必要信息。这是通过将qmake项目模板设置为vcapp(用于应用程序项目)或vclib(用于库项目)来实现的。 这也可以使用命令行选项来设置,例如:

代码语言:javascript复制
qmake -tp vc

通过输入以下命令,可以递归地在子目录中生成.vcproj文件,在主目录中生成.sln文件:

代码语言:javascript复制
qmake -tp vc -r

每次更新项目文件时,都需要运行qmake来生成更新的Visual Studio项目。 注意:如果使用的是Visual Studio加载项,请选择Qt > 从.pro文件导入以导入.pro文件。

Visual Studio清单文件

部署使用Visual Studio 2005或更高版本构建的Qt应用程序时,请确保正确处理应用程序链接时创建的清单文件。这将自动处理生成DLL的项目。 删除应用程序可执行文件的清单嵌入可以通过以下对CONFIG变量的赋值来完成:

代码语言:javascript复制
CONFIG  -= embed_manifest_exe

此外,DLL的清单嵌入可以通过以下分配给CONFIG变量来删除:

代码语言:javascript复制
CONFIG  -= embed_manifest_dll

这在Windows的部署指南中有更详细的讨论。

qmake语言

许多qmake项目文件使用name = valuename = value定义列表来简单描述项目使用的源文件和头文件。 qmake还提供了其他操作符,函数和范围,可用于处理变量声明中提供的信息。这些高级功能允许从单个项目文件为多个平台生成Makefiles

操作

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

分配值

=运算符为一个变量赋值:

代码语言:javascript复制
TARGET = myapp

上面的行将TARGET变量设置为myapp。这将覆盖之前为myapp设置的TARGET值。

附加值

=运算符将一个新值附加到变量中的值列表中:

代码语言:javascript复制
DEFINES -= USE_MY_STUFF

上面的行将USE_MY_STUFF附加到预处理器定义列表中,放入生成的Makefile中。

删除值

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

代码语言:javascript复制
DEFINES -= USE_MY_STUFF

上面的行从预处理器定义列表中删除USE_MY_STUFF,将其放入生成的Makefile中。

添加唯一值

*=操作符将值添加到变量中的值列表中,但只有在该值不存在的情况下。这可以防止值被多次包含在一个变量中。例如:

代码语言:javascript复制
DEFINES *= USE_MY_STUFF

在上面的行中,USE_MY_STUFF只会被添加到预处理器定义列表中(如果尚未定义的话)。请注意,unique()函数也可用于确保变量只包含每个值的一个实例。

替换值

〜=运算符用指定的值替换与正则表达式匹配的任何值:

代码语言:javascript复制
DEFINES ~= s/QT_[DT]. /QT

在上面的行中,列表中以QT_DQT_T开头的任何值都将被替换为QT。

变量扩展

$$运算符用于提取变量的内容,并可用于在变量之间传递值或将其提供给函数:

代码语言:javascript复制
EVERYTHING = $$SOURCES $$HEADERS
message("The project contains the following files:")
message($$EVERYTHING)

变量可以用来存储环境变量的内容。这些可以在运行qmake时进行评估,或者在生成项目时生成的Makefile中进行评估。 要在运行qmake时获取环境值的内容,请使用$$(...)运算符:

代码语言:javascript复制
DESTDIR = $$(PWD)
message(The project will be installed in $$DESTDIR)

在上面的分配中,当处理项目文件时读取PWD环境变量的值。 要在生成的Makefile处理时获取环境值的内容,请使用$(...)运算符:

代码语言:javascript复制
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属性

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

代码语言:javascript复制
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的内置插件一起安装:

代码语言:javascript复制
target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS  = target

作用域

范围与过程式编程语言中的if语句相似。如果某个条件成立,则范围内的声明将被处理。

范围语法

作用域包括一个条件,在同一行上有一个左大括号,一系列命令和定义,以及一个新行上的右大括号:

代码语言:javascript复制
<condition> {
    <command or definition>
    ...
}

大括号必须与条件写在同一行上。范围可以连接成包含多个条件,如以下各节所述。

范围和条件

作用域被写为一个条件,后面跟着一对括号中的一系列声明。例如:

代码语言:javascript复制
win32 {
    SOURCES  = paintwidget_win.cpp
}

上面的代码将在构建Windows平台时将paintwidget_win.cpp文件添加到生成的Makefile中列出的源文件中。在为其他平台构建时,定义将被忽略。

在一个给定的范围中使用的条件也可以被否定,以提供一个替代的一组声明,只有当原始条件是错误时才会被处理。例如,要为Windows以外的所有平台构建时处理某些内容,请取消这样的作用域:

代码语言:javascript复制
!win32 {
    SOURCES -= paintwidget_win.cpp
}

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

代码语言:javascript复制
macx {
    CONFIG(debug, debug|release) {
        HEADERS  = debugging.h
    }
}

为了节省编写很多嵌套的作用域,可以使用:运算符来嵌套作用域。上面例子中的嵌套作用域可以用下面的方法重写:

代码语言:javascript复制
macx:CONFIG(debug, debug|release) {
    HEADERS  = debugging.h
}

您也可以使用运算符来执行单行条件分配。例如:

代码语言:javascript复制
win32:DEFINES  = USE_MY_STUFF

仅当为Windows平台构建时,以上行将USE_MY_STUFF添加到DEFINES变量。通常,运算符的行为就像一个逻辑AND运算符,将许多条件连接在一起,并要求所有这些条件成立。

还有|运算符像一个逻辑OR运算符一样,将多个条件连接在一起,并且只要求其中的一个为真。

代码语言:javascript复制
win32|macx {
    HEADERS  = debugging.h
}

您还可以通过使用其他作用域来为范围内的提供替代声明。如果上述作用域的条件为假,则处理其他作用域。这样,您可以在与其他范围组合时编写复杂的测试(由上面的运算符分隔)。例如:

代码语言:javascript复制
win32:xml {
    message(Building for Windows)
    SOURCES  = xmlhandler_win.cpp
} else:xml {
    SOURCES  = xmlhandler.cpp
} else {
    message("Unknown configuration")
}

配置和范围

存储在CONFIG变量中的值由qmake特别处理。每个可能的值都可以用作作用域的条件。例如,CONFIG保存的值列表可以用opengl值扩展:

代码语言:javascript复制
CONFIG   = opengl

作为这个操作的结果,任何测试opengl的作用域都将被处理。我们可以使用这个特性给最终的可执行文件一个合适的名字:

代码语言:javascript复制
opengl {
    TARGET = application-gl
} else {
    TARGET = application
}

此功能可以轻松更改项目的配置,而不会丢失特定配置可能需要的所有自定义设置。在上面的代码中,第一个作用域中的声明被处理,最终的可执行文件将被称为application-gl。但是,如果未指定opengl,则将处理第二个作用域中的声明,而最终的可执行文件将被称为application

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

平台范围值

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

代码语言:javascript复制
message($$QMAKESPEC)
linux-g   {
    message(Linux)
}

只要mkspecs目录中存在规范,就可以测试任何其他平台 – 编译器组合。

变量

项目文件中使用的许多变量是qmake在生成Makefile时使用的特殊变量,如DEFINESSOURCESHEADERS。另外,您可以创建自己使用的变量。当qmake遇到一个赋值给这个名字的时候,就会用给定的名字创建新的变量。例如:

代码语言:javascript复制
MY_VARIABLE = value

对你自己的变量做什么没有限制,因为qmake会忽略它们,除非需要在处理作用域时对它们进行评估。

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

代码语言:javascript复制
MY_DEFINES = $$DEFINES

现在,MY_DEFINES变量包含项目文件中此时的DEFINES变量中的内容。这也等同于:

代码语言:javascript复制
MY_DEFINES = $${DEFINES}

第二个符号允许您将变量的内容附加到另一个值,而不用两个空格分隔。例如,以下内容将确保最终的可执行文件将被赋予一个包含正在使用的项目模板的名称:

代码语言:javascript复制
TARGET = myproject_$${TEMPLATE}

替换函数

qmake提供了一系列内置的函数来处理变量的内容。这些函数处理提供给它们的参数,并返回值或值列表。要将一个结果赋值给一个变量,可以使用这个类型的函数$$操作符来将一个变量的内容赋值给另一个变量:

代码语言:javascript复制
HEADERS = model.h
HEADERS  = $$OTHER_HEADERS
HEADERS = $$unique(HEADERS)

这种类型的函数应该用在赋值的右边(即作为操作数)。

你可以定义你自己的函数来处理变量的内容,如下所示:

代码语言:javascript复制
defineReplace(functionName){
    #function code
}

以下示例函数将变量名称作为其唯一参数,使用eval()内置函数从变量中提取值列表,并编译文件列表:

代码语言:javascript复制
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提供的内置函数可以在编写作用域时用作条件。这些函数不会返回值,而是指示成功或失败:

代码语言:javascript复制
count(options, 2) {
    message(Both release and debug specified.)
}

这种类型的函数只能在条件表达式中使用。

可以定义你自己的函数来为范围提供条件。以下示例测试列表中的每个文件是否存在,如果全部存在,则返回true否则返回false

代码语言:javascript复制
defineTest(allFiles) {
    files = $$ARGS
    for(file, files) {
    	!exists($$file) {
            return(false)
        }
    }
    return(true)
}

高级用法

添加新的配置功能

qmake允许你创建你自己的特性,通过将它们的名字添加到CONFIG变量指定的值列表中,可以将其包含在项目文件中。功能是可以驻留在许多标准目录中的.prf文件中的自定义函数和定义的集合。这些目录的位置在很多地方都有定义,当查找.prf文件时,qmake按照以下顺序检查它们:

  1. QMAKEFEATURES环境变量中列出的目录中,该目录包含由平台的路径列表分隔符(Unix的冒号,Windows的分号)分隔的目录列表。
  2. 在包含由平台路径列表分隔符分隔的目录列表的QMAKEFEATURES属性变量中列出的目录中。
  3. 在位于mkspecs目录内的功能目录中。mkspecs目录可以位于QMAKEPATH环境变量中列出的任何目录之下,其中包含由平台的路径列表分隔符分隔的目录列表。例如:$QMAKEPATH/mkspecs/<features>
  4. 在位于QMAKESPEC环境变量提供的目录下的一个功能目录中。例如:$QMAKESPEC/<features>
  5. 在驻留在data_install/mkspecs目录中的功能目录中。例如:data_install/mkspecs/<features>
  6. 在作为由QMAKESPEC环境变量指定的目录的兄弟目录存在的特征目录中。例如:$QMAKESPEC/../<features>

以下功能目录将搜索功能文件:

  1. features/unix,features/win32或features/macx,具体取决于所使用的平台
  2. features/

例如,考虑项目文件中的以下分配:

代码语言:javascript复制
CONFIG   = myfeatures

除了CONFIG变量之外,qmake在完成解析项目文件之后,将搜索上面列出的myfeatures.prf文件的位置。在Unix系统上,它会查找以下文件:

  1. $QMAKEFEATURES/myfeatures.prf(对于QMAKEFEATURES环境变量中列出的每个目录)
  2. $$QMAKEFEATURES/myfeatures.prf(用于QMAKEFEATURES属性变量中列出的每个目录)
  3. myfeatures.prf(在项目的根目录下)
  4. QMAKEPATH/mkspecs/features/unix/myfeatures.prf和QMAKEPATH/mkspecs/features/myfeatures.prf(用于QMAKEPATH环境变量中列出的每个目录)
  5. QMAKESPEC/features/unix/myfeatures.prf和QMAKESPEC/features/myfeatures.prf
  6. data_install/mkspecs/features/unix/myfeatures.prfdata_install/mkspecs/features/myfeatures.prf
  7. QMAKESPEC/../features/unix/myfeatures.prf和QMAKESPEC/../features/myfeatures.prf

.prf文件的名称必须小写。

安装文件

Unix上通常也使用构建工具来安装应用程序和库;例如,通过调用make install。出于这个原因,qmake有一个安装集的概念,一个对象,其中包含有关项目的一部分将被安装的方式的说明。例如,可以用以下方式描述文档文件集合:

代码语言:javascript复制
documentation.path  = /usr/local/program/doc
documentation.files = docs/*

路径成员通知qmake文件应该安装在/usr/local/program/doc(路径成员)中,文件成员指定了应该复制到安装目录的文件。在这种情况下,docs目录中的所有内容都将被复制到/usr/local/program/doc中。 一旦完整描述了安装集,您可以使用下面这行代码将其附加到安装列表中:

代码语言:javascript复制
INSTALLS  = documentation

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

代码语言:javascript复制
unix:documentation.extra = create_docs; mv master.doc toc.doc

unix范围确保这些特定的命令只在Unix平台上执行。其他平台的适当命令可以使用其他范围规则来定义。

在执行该对象的其他成员中的指令之前执行在该额外成员中指定的命令。 如果将一个内置的安装集添加到INSTALLS变量中,并且不指定文件或额外的成员,则qmake将决定需要为您复制的内容。目前,支持目标和dlltarget安装集。例如:

代码语言:javascript复制
target.path = /usr/local/myprogram
INSTALLS    = target

在上面的几行中,qmake知道需要复制什么,并自动处理安装过程。

添加自定义目标

qmake试图做一切跨平台构建工具。当你真的需要运行特殊的平台相关的命令时,这往往不太理想。这可以通过对不同的qmake后端的具体说明来实现。 Makefile输出的定制是通过在qmake的其他地方找到的对象风格的API来执行的。对象通过指定其成员来自动定义。例如:

代码语言:javascript复制
mytarget.target     = .buildfile
mytarget.commands   = touch $$mytarget.target
mytarget.depends 	= mytarget2
mytarget2.commands 	= @echo Building $$mytarget.target

上面的定义定义了一个名为mytargetqmake目标,其中包含一个名为.buildfileMakefile目标,而该目标又是通过touch()函数生成的。最后,.depends成员指定mytarget依赖mytarget2,这是另一个之后定义的目标。 mytarget2是一个虚拟目标。它只被定义为回显一些文本到控制台。 最后一步是使用QMAKE_EXTRA_TARGETS变量来指示qmake这个对象是要构建的目标:

代码语言:javascript复制
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来支持新的编译器和预处理器:

代码语言:javascript复制
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保存有关库的信息:

代码语言:javascript复制
CONFIG   = create_prl

这只与lib模板相关,并且对于其他模板将被忽略。启用此选项后,qmake将创建一个以.prl结尾的文件,该文件将保存关于该库的一些元信息。这个元文件就像一个普通的项目文件,但只包含内部变量声明。当安装这个库时,通过在INSTALLS声明中指定它作为目标,qmake会自动将.prl文件复制到安装路径。

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

代码语言:javascript复制
CONFIG   = link_prl

当启用这个功能时,qmake会处理应用程序链接的所有库,并找到他们的元信息。 qmake将使用它来确定相关的链接信息,特别是将值添加到应用程序项目文件的DEFINES列表以及LIBS中。一旦qmake处理完这个文件,它就会查看LIBS变量中新引入的库,并找到它们的依赖.prl文件,直到所有的库都被解析为止。在这一点上,像往常一样创建Makefile,并且库与应用程序显式链接。

.prl文件只能由qmake创建,不能在操作系统之间传输,因为它们可能包含平台依赖信息。

使用预编译头

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

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

  • windows
    • nmake
    • Visual Studio项目(VS 2008及更高版本)
  • macOS,iOS,tvOS和watchOS
    • Makefile
    • Xcode
  • Unix
    • GCC 3.4及以上

将预编译的头添加到您的项目

预编译头文件必须包含在整个项目中稳定和静态的代码。一个典型的预编译头文件可能如下所示:

代码语言:javascript复制
// Add C includes here
#if defined __cplusplus
// Add C   includes here
#include <stdlib>
#include <iostream>
#include <vector>
#include <QApplication> // Qt includes
#include <QPushButton>
#include <QLabel>
#include "thirdparty/include/libmain.h"
#include "my_stable_class.h"
...
#endif

注意:预编译头文件需要将C包括从C 包含中分离出来,因为C文件的预编译头文件可能不包含C 代码。

项目选项

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

代码语言:javascript复制
PRECOMPILED_HEADER = stable.h

qmake将处理剩下的部分,以确保预编译头文件的创建和使用。你不需要在HEADERS中包含预编译头文件,因为如果配置支持预编译头文件,qmake会这样做。

针对WindowsMSVCg 规范默认启用precompile_header。 使用这个选项,你可能会触发项目文件中的条件块来添加使用预编译头文件的设置。例如:

代码语言:javascript复制
precompile_header:!isEmpty(PRECOMPILED_HEADER) {
    DEFINES  = USING_PCH
}

有关可能的问题的说明 在某些平台上,预编译头文件的文件名后缀与其他目标文件的后缀相同。例如,以下声明可能会导致生成具有相同名称的两个不同的目标文件:

代码语言:javascript复制
PRECOMPILED_HEADER = window.h
SOURCES = window.cpp

为了避免像这样的潜在冲突,给予预编译的头文件一个独特的名字。

示例项目

您可以在Qt发行版的examples/qmake/precompile目录中找到以下源代码: mydialog.ui 下图显示了Qt Creator设计模式下的mydialog.ui文件。您可以在编辑模式下查看代码。

stable.h

代码语言:javascript复制
/* Add C includes here */
#if defined __cplusplus
/* Add C   includes here */
# include <iostream>
# include <QApplication>
# include <QPushButton>
# include <QLabel>
#endif

myobject.h

代码语言:javascript复制
#include <QObject>
class MyObject : public QObject
{
  public:
  MyObject();
  ~MyObject();
};

myobject.cpp

代码语言:javascript复制
#include <iostream>
#include <QDebug>
#include <QObject>
#include "myobject.h"
MyObject::MyObject()
: QObject()
{ std::cout << "MyObject::MyObject()n"; }

util.cpp

代码语言:javascript复制
void util_function_does_nothing()
{
    // Nothing here...
    int x = 0;
      x;
}

main.cpp

代码语言:javascript复制
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#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

代码语言:javascript复制
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中设置一个属性如下:

代码语言:javascript复制
qmake -set PROPERTY VALUE

PROPERTYVALUE应取代适当的属性和值。

你可以从qmake中获取这个信息,如下所示:

代码语言:javascript复制
qmake -query PROPERTY  
qmake -query #queries all current PROPERTY/VALUE pairs

注意:除了使用qmake -set PROPERTY VALUE设置的属性之外,qmake -query还会列出内置属性。

这些信息将被保存到一个QSettings对象中(这意味着它将被存储在不同平台的不同地方)。 以下列表总结了内置属性:

  • QMAKE_SPEC – 主机构建过程中解析并存储在QMAKESPEC变量中的主机mkspec的简称
  • QMAKE_VERSION – qmake的当前版本
  • QMAKE_XSPEC – 目标构建期间解析并存储在QMAKESPEC变量中的目标mkspec的简称
  • QT_HOST_BINS – 主机可执行文件的位置
  • QT_HOST_DATA – qmake使用的主机可执行文件的数据位置
  • QT_HOST_PREFIX – 所有主机路径的默认前缀
  • QT_INSTALL_ARCHDATA – 一般体系结构相关的Qt数据的位置
  • QT_INSTALL_BINS – Qt二进制文件的位置(工具和应用程序)
  • QT_INSTALL_CONFIGURATION – Qt设置的位置。不适用于Windows
  • QT_INSTALL_DATA – 通用架构无关的Qt数据的位置
  • QT_INSTALL_DOCS – 文档的位置
  • QT_INSTALL_EXAMPLES – 示例的位置
  • QT_INSTALL_HEADERS – 所有头文件的位置
  • QT_INSTALL_IMPORTS – QML 1.x扩展的位置
  • QT_INSTALL_LIBEXECS – 运行时库所需的可执行文件的位置
  • QT_INSTALL_LIBS – 库的位置
  • QT_INSTALL_PLUGINS – Qt插件的位置
  • QT_INSTALL_PREFIX – 所有路径的默认前缀
  • QT_INSTALL_QML – QML 2.x扩展的位置
  • QT_INSTALL_TESTS – Qt测试用例的位置
  • QT_INSTALL_TRANSLATIONS – Qt字符串的翻译信息的位置
  • QT_SYSROOT – 目标构建环境使用的sysroot
  • QT_VERSION – Qt版本。我们建议您使用$$QT。 .version变量来查询Qt模块特定的版本号。

例如,您可以使用QT_INSTALL_PREFIX属性来查询此版本的qmake的Qt安装:

代码语言:javascript复制
qmake -query "QT_INSTALL_PREFIX"

您可以按如下方式查询项目文件中的属性值:

代码语言:javascript复制
QMAKE_VERS = $$[QMAKE_VERSION]

QMAKESPEC

qmake需要一个平台和编译器描述文件,其中包含许多用于生成适当的Makefile的默认值。标准的Qt发行版附带了许多这些文件,位于Qt安装的mkspecs子目录中。

QMAKESPEC环境变量可以包含以下任何一个:

  • 包含qmake.conf文件的目录的完整路径。在这种情况下,qmake将从该目录中打开qmake.conf文件。如果文件不存在,qmake将会退出并显示错误。
  • 平台 – 编译器组合的名称。在这种情况下,qmake将搜索Qt编译时指定的数据路径的mkspecs子目录指定的目录(请参阅QLibraryInfo :: DataPath)。

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

缓存文件

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

如果qmake找到一个.qmake.cache文件,那么它将在处理该项目文件之前先处理这个文件。

文件扩展名

在正常情况下,qmake会尝试为您的平台使用适当的文件扩展名。但是,有时需要重写每个平台的默认选项,并明确定义要使用的qmake的文件扩展名。这是通过重新定义某些内置变量来实现的。例如,用于moc文件的扩展名可以在项目文件中使用以下分配来重新定义:

代码语言:javascript复制
QMAKE_EXT_MOC = .mymoc

以下变量可用于重新定义由qmake识别的常用文件扩展名:

  • QMAKE_EXT_MOC修改放置在包含的moc文件中的扩展名。
  • QMAKE_EXT_UI修改用于Qt Designer UI文件的扩展(通常在FORMS中)。
  • QMAKE_EXT_PRL修改放置在库依赖项文件上的扩展名。
  • QMAKE_EXT_LEX更改Lex文件中使用的后缀(通常在LEXSOURCES中)。
  • QMAKE_EXT_YACC更改Yacc文件中使用的后缀(通常在YACCSOURCES中)。
  • QMAKE_EXT_OBJ更改生成的对象文件上使用的后缀。

以上所有接受的只是第一个值,所以您必须为其分配一个将在整个项目文件中使用的值。有两个变量接受一个值列表:

  • QMAKE_EXT_CPP导致qmake将这些后缀的所有文件解释为C 源文件。
  • QMAKE_EXT_H导致qmake将这些后缀的所有文件解释为C和C 头文件。

参考

参考部分详细描述了可用于qmake项目文件的变量和函数。

变量引用

变量描述了在为项目配置构建过程时由qmake识别的变量。

函数参考

有两种类型的qmake功能:替换功能和测试功能。 替换函数返回一个值列表,而测试函数返回一个布尔结果。 这些功能在两个地方实现:基本功能作为内置功能提供。 功能文件库(.prf)中实现了更复杂的功能。 功能根据其类型分为几类:

  • 替换函数
  • 测试功能

变量

qmake的基本行为受变量声明的影响,变量声明定义了每个项目的构建过程。其中一些声明资源,如标题和源文件,是每个平台的共同点。其他用于定制特定平台上编译器和链接器的行为。

特定于平台的变量遵循它们扩展或修改的变量的命名模式,但在其名称中包含相关平台的名称。例如,QMAKE_LIBS可用于指定项目需要链接的库的列表,QMAKE_LIBS_X11可用于扩展或覆盖此列表。

CONFIG

指定项目配置和编译器选项。这些值由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。这使得执行特定于构建的任务成为可能。例如:

代码语言:javascript复制
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选项将确定默认值。在这种情况下,您可以明确地调用全部目标来同时构建两个配置:

代码语言:javascript复制
make all

注意:生成Visual StudioXcode项目时的细节略有不同。

当链接一个库时,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变量在解析范围时也会被检查。你可以分配任何东西给这个变量。 例如:

代码语言:javascript复制
CONFIG  = console newstuff
    ...
    newstuff {
        SOURCES  = new.cpp
        HEADERS  = new.h
}

DEFINES

qmake将此变量的值作为编译器C预处理器宏(-D选项)添加。 例如:

代码语言:javascript复制
DEFINES  = USE_MY_STUFF

DEF_FILE

注意:使用应用程序模板时,此变量仅在Windows上使用。 指定要包含在项目中的.def文件。

DEPENDPATH

指定要查找以解决依赖关系的所有目录的列表。在通过包含文件进行爬网时使用此变量。

DESTDIR

指定目标文件的放置位置。 例如:

代码语言:javascript复制
DESTDIR = ../../lib

DISTFILES

指定要包含在dist目标中的文件列表。 UnixMake规范仅支持此功能。 例如:

代码语言:javascript复制
DISTFILES  = ../program.txt

DLLDESTDIR

注意:此变量仅适用于Windows目标。 指定在哪里复制目标dll

FORMS

指定UI文件(请参阅Qt Designer手册)在编译之前由uic处理。构建这些UI文件所需的所有依赖项,头文件和源文件将自动添加到项目中。 例如:

代码语言:javascript复制
FORMS = mydialog.ui 
      mywidget.ui 
      myconfig.ui

GUID

指定在.vcproj文件中设置的GUIDGUID通常是随机确定的。但是,如果您需要固定的GUID,则可以使用此变量进行设置。 这个变量只针对.vcproj文件。否则将被忽略。

HEADERS

定义项目的头文件。 qmake自动检测头文件中的类是否需要moc,并将相应的依赖项和文件添加到项目中以生成和链接moc文件。 例如:

代码语言:javascript复制
HEADERS = myclass.h 
         login.h 
         mainwindow.h

ICON

此变量仅在Mac OS上用于设置应用程序图标。请参阅 the application icon documentation 以获取更多信息。

IDLSOURCES

此变量仅在Visual Studio项目生成的Windows上用于将指定的文件放入#include文件夹中。

INCLUDEPATH

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

代码语言:javascript复制
INCLUDEPATH = c:/msdev/include d:/stl/include

要指定包含空格的路径,请使用空白中描述的技术引用路径。

代码语言:javascript复制
win32:INCLUDEPATH  = "C:/mylibs/extra headers"
unix:INCLUDEPATH   = "/home/user/extra headers"

INSTALLS

指定执行make install或类似安装过程时将要安装的资源列表。列表中的每个项目通常使用提供有关安装位置的信息的属性进行定义。 例如,以下target.path定义将描述构建目标的安装位置,INSTALLS赋值将构建目标添加到要安装的现有资源列表中:

代码语言:javascript复制
target.path  = $$[QT_INSTALL_PLUGINS]/imageformats
INSTALLS  = target

有关更多信息,请参阅Installing Files

这个变量也用来指定哪些附加文件将被部署到嵌入式设备。

LEXIMPLS

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

LEXOBJECTS

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

LEXSOURCES

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

代码语言:javascript复制
LEXSOURCES = lexer.l

LIBS

指定要链接到项目中的库的列表。如果使用Unix -l(库)和-L(库路径)标志,则qmake将在Windows上正确处理库(也就是将库的完整路径传递给链接器)。该库必须为qmake而存在以查找-l lib所在的目录。 例如:

代码语言:javascript复制
unix:LIBS   = -L/usr/local/lib -lmath
win32:LIBS  = c:/mylibs/math.lib

要指定包含空格的路径,请使用空白中描述的技术引用路径。

代码语言:javascript复制
win32:LIBS  = "C:/mylibs/extra libs/extra.lib"
unix:LIBS   = "-L/home/user/extra libs" -lextra

默认情况下,存储在LIBS中的库列表在使用之前被缩减为唯一名称列表。要改变这种行为,将no_lflags_merge选项添加到CONFIG变量中:

代码语言:javascript复制
CONFIG  = no_lflags_merge

LITERAL_HASH

只要在变量声明中需要一个文字哈希字符(),就可以使用这个变量,可能作为文件名的一部分或传递给某个外部应用程序的字符串。 例如:

代码语言:javascript复制
# 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

指定生成的Makefile的名称。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

MAKEFILE_GENERATOR

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

MSVCPROJ_ *

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

MOC_DIR

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

代码语言:javascript复制
unix:MOC_DIR  = ../myproject/tmp
win32:MOC_DIR = c:/myproject/tmp

OBJECTS

这个变量是从SOURCES变量自动填充的。每个源文件的扩展名都被替换为.oUnix)或.objWin32)。您可以将对象添加到列表中。

OBJECTS_DIR

指定应放置所有中间对象的目录。 例如:

代码语言:javascript复制
unix:OBJECTS_DIR  = ../myproject/tmp
win32:OBJECTS_DIR = c:/myproject/tmp

POST_TARGETDEPS

列出目标所依赖的库。一些后端(如Visual StudioXcode项目文件的生成器)不支持此变量。一般来说,这个变量是由这些构建工具在内部支持的,而且对于显式列出依赖的静态库非常有用。

该列表放置在所有内建(和$PRE_TARGETDEPS)依赖关系之后。

PRE_TARGETDEPS

列出目标所依赖的库。一些后端(如Visual StudioXcode项目文件的生成器)不支持此变量。一般来说,这个变量是由这些构建工具在内部支持的,而且对于显式列出依赖的静态库非常有用。

这个列表放置在所有的内建依赖项之前。

PRECOMPILED_HEADER

指示用于创建预编译头文件的头文件,以提高项目的编译速度。预编译头文件目前仅在某些平台上支持(Windows – 所有MSVC项目类型,AppleXcodeMakefileUnixgcc 3.3及更高版本)。

PWD

指定指向包含当前正在分析的文件的目录的完整路径。编写项目文件以支持阴影构建时,这可能有助于在源代码树中引用文件。 另请参阅_PRO_FILE_PWD_注意:不要试图覆盖这个变量的值。

OUT_PWD

指定通往qmake放置生成的Makefile的目录的完整路径。 注意:不要试图覆盖这个变量的值。

QMAKE

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

QMAKESPEC

包含生成Makefiles时使用的qmake配置的完整路径的系统变量。这个变量的值是自动计算的。 注意:不要试图覆盖这个变量的值。

QMAKE_AR_CMD

注意:这个变量只在Unix平台上使用。 指定创建共享库时要执行的命令。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_BUNDLE_DATA

注意:此变量仅用于macOSiOStvOSwatchOS。 指定将与库包一起安装的数据,通常用于指定头文件的集合。 例如,以下行将path/to/header_one.hpath/to/header_two.h添加到包含框架提供的头信息的组中:

代码语言:javascript复制
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变量时,会创建库包。 有关创建库包的更多信息,请参阅平台注释

QMAKE_BUNDLE_EXTENSION

注意:此变量仅用于macOSiOStvOSwatchOS。 指定要用于库包的扩展。这允许使用自定义扩展而不是标准的.framework目录名称扩展来创建框架。 例如,下面的定义将导致一个带有.myframework扩展的框架:

代码语言:javascript复制
QMAKE_BUNDLE_EXTENSION = .myframework

QMAKE_CC

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

QMAKE_CFLAGS

指定用于构建项目的C编译器标志。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。特定于调试和释放模式的标志可以通过分别修改QMAKE_CFLAGS_DEBUGQMAKE_CFLAGS_RELEASE变量进行调整。

QMAKE_CFLAGS_DEBUG

指定调试版本的C编译器标志。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_CFLAGS_RELEASE

指定发布版本的C编译器标志。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_CFLAGS_SHLIB

注意:这个变量只在Unix平台上使用。 指定用于创建共享库的编译器标志。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_CFLAGS_THREAD

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

QMAKE_CFLAGS_WARN_OFF

该变量仅在设置了warn_off CONFIG选项时使用。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_CFLAGS_WARN_ON

该变量仅在设置了warn_on CONFIG选项时使用。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_CLEAN

指定生成的文件列表(例如mocuic)以及make clean要删除的目标文件。

QMAKE_CXX

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

QMAKE_CXXFLAGS

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

QMAKE_CXXFLAGS_DEBUG

指定调试版本的C 编译器标志。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_CXXFLAGS_RELEASE

指定发布版本的C 编译器标志。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_CXXFLAGS_SHLIB

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

QMAKE_CXXFLAGS_THREAD

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

QMAKE_CXXFLAGS_WARN_OFF

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

QMAKE_CXXFLAGS_WARN_ON

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

QMAKE_DEVELOPMENT_TEAM

注意:此变量仅用于macOSiOStvOSwatchOS。 用于签署证书和配置文件的开发小组的标识符。

QMAKE_DISTCLEAN

指定通过make distclean删除的文件列表。

QMAKE_EXTENSION_SHLIB

包含共享库的扩展。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。 注意:更改扩展名的特定于平台的变量会覆盖此变量的内容。

QMAKE_EXTENSION_STATICLIB

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

QMAKE_EXT_MOC

包含在包含的moc文件上使用的扩展名。 另请参阅文件扩展名。

QMAKE_EXT_UI

包含在Qt Designer UI文件上使用的扩展。 另请参阅文件扩展名。

QMAKE_EXT_PRL

包含在创建的PRL文件上使用的扩展名。 另请参阅文件扩展名,库依赖关系。

QMAKE_EXT_LEX

包含给予Lex的文件的扩展名。 另请参阅文件扩展名,LEXSOURCES

QMAKE_EXT_YACC

包含给予Yacc的文件的扩展名。 另请参阅文件扩展名YACCSOURCES

QMAKE_EXT_OBJ

包含在生成的对象文件上使用的扩展名。 另请参阅文件扩展名。

QMAKE_EXT_CPP

包含应解释为C 源代码的文件的后缀。 另请参阅文件扩展名。

QMAKE_EXT_H

包含应被解释为C头文件的文件的后缀。 另请参阅文件扩展名。

QMAKE_EXTRA_COMPILERS

指定其他编译器或预处理器的列表。 另请参阅添加编译器。

QMAKE_EXTRA_TARGETS

指定其他qmake目标的列表。 另请参阅添加自定义目标。

QMAKE_FAILED_REQUIREMENTS

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

QMAKE_FRAMEWORK_BUNDLE_NAME

注意:此变量仅用于macOSiOStvOSwatchOS。 在框架项目中,此变量包含要构建的框架使用的名称。 默认情况下,该变量包含与TARGET变量相同的值。 有关创建框架和库包的更多信息,请参阅创建框架。

QMAKE_FRAMEWORK_VERSION

注意:此变量仅用于macOSiOStvOSwatchOS。 对于构建目标是macOSiOStvOSwatchOS框架的项目,此变量用于指定将应用于构建的框架的版本号。 默认情况下,该变量包含与VERSION变量相同的值。 有关创建框架的更多信息,请参阅创建框架。

QMAKE_HOST

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

Keys

Values

.arch

主机架构

.os

主机操作系统

.cpu_count

可用的cpus数量

.name

主机名称

.version

主机操作系统版本号

.version_string

主机OS版本字符串

代码语言:javascript复制
win32-g  :contains(QMAKE_HOST.arch, x86_64):{
    message("Host is 64bit")
    ...
}

QMAKE_INCDIR

指定附加到INCLUDEPATH的系统标题路径的列表。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_INCDIR_EGL

指定在使用OpenGL/ESOpenVG支持构建目标时要添加到INCLUDEPATHEGL头文件的位置。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_INCDIR_OPENGL

指定在构建具有OpenGL支持的目标时要添加到INCLUDEPATHOpenGL头文件的位置。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。 如果OpenGL实现使用EGL(大多数OpenGL/ES系统),那么也可能需要设置QMAKE_INCDIR_EGL

QMAKE_INCDIR_OPENGL_ES2

当使用OpenGLES2支持构建目标时,此变量指定要添加到INCLUDEPATHOpenGL头文件的位置。 这个变量的值通常由qmakeqmake.conf处理,很少需要修改。 如果OpenGL实现使用EGL(大多数OpenGL/ES系统),那么也可能需要设置QMAKE_INCDIR_EGL

QMAKE_INCDIR_OPENVG

指定OpenVG头文件在创建OpenVG支持目标时添加到INCLUDEPATH的位置。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。 如果OpenVG实现使用EGL,则可能还需要设置QMAKE_INCDIR_EGL

QMAKE_INCDIR_X11

注意:这个变量只在Unix平台上使用。 指定在构建X11目标时要添加到INCLUDEPATHX11头文件路径的位置。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_INFO_PLIST

注意:此变量仅用于macOSiOStvOSwatchOS平台。 指定要包含在macOSiOStvOSwatchOS应用程序包中的属性列表文件.plist的名称。

.plist文件中,可以定义一些变量,例如@ EXECUTABLE @qmake将用实际的可执行文件名替换。其他变量包括@ ICON @@ TYPEINFO @@ LIBRARY @@ SHORT_VERSION @

如果为iOS构建,并且.plist文件包含关键的NSPhotoLibraryUsageDescription,则qmake将在该构建中增加一个额外的插件,以增加照片访问支持(例如对于QFile/QFileDialog)。有关此密钥的更多信息,请参阅Apple的Info.plist文档。

注意:大多数情况下,Info.plist默认是足够好的。

QMAKE_IOS_DEPLOYMENT_TARGET

注意:此变量仅在iOS平台上使用。 指定应用程序支持的最低版本的iOS。 有关更多信息,请参阅表达支持的iOS版本。

QMAKE_LFLAGS

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

QMAKE_LFLAGS_CONSOLE

注意:此变量仅在Windows上使用。 指定构建控制台程序的链接器标志。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LFLAGS_DEBUG

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

QMAKE_LFLAGS_PLUGIN

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

QMAKE_LFLAGS_RPATH

注意:这个变量只在Unix平台上使用。 指定使用来自QMAKE_RPATHDIR的值所需的链接器标志。 这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LFLAGS_REL_RPATH

指定在QMAKE_RPATHDIR中启用相对路径所需的链接器标志。 这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_REL_RPATH_BASE

指定动态链接器理解为引用可执行文件或库的位置的字符串。 这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LFLAGS_RPATHLINK

指定使用来自QMAKE_RPATHLINKDIR的值所需的链接器标志。 这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LFLAGS_RELEASE

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

QMAKE_LFLAGS_APP

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

QMAKE_LFLAGS_SHLIB

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

QMAKE_LFLAGS_SONAME

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

QMAKE_LFLAGS_THREAD

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

QMAKE_LFLAGS_WINDOWS

注意:此变量仅在Windows上使用。 指定用于构建Windows GUI项目的链接器标志(即非控制台应用程序)。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LIBDIR

指定系统库路径的列表。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LIBDIR_FLAGS

注意:这个变量只在Unix平台上使用。 使用-L前缀指定所有库目录的位置。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LIBDIR_EGL

指定EGLOpenGL/ESOpenVG一起使用时EGL库目录的位置。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LIBDIR_OPENGL

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

如果OpenGL实现使用EGL(大多数OpenGL/ES系统),那么也可能需要设置QMAKE_LIBDIR_EGL

QMAKE_LIBDIR_OPENVG

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

如果OpenVG实现使用EGL,那么也可能需要设置QMAKE_LIBDIR_EGL

QMAKE_LIBDIR_X11

注意:这个变量只在Unix平台上使用。 指定X11库目录的位置。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LIBS

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

QMAKE_LIBS_EGL

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

QMAKE_LIBS_OPENGL

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

如果OpenGL实现使用EGL(大多数OpenGL/ES系统),那么也可能需要设置QMAKE_LIBS_EGL

QMAKE_LIBS_OPENGL_ES1QMAKE_LIBS_OPENGL_ES2 这些变量指定了OpenGL ES 1OpenGL ES 2的所有OpenGL库。 这些变量的值通常由qmakeqmake.conf处理,很少需要修改。 如果OpenGL实现使用EGL(大多数OpenGL / ES系统),那么也可能需要设置QMAKE_LIBS_EGL

QMAKE_LIBS_OPENVG

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

一些OpenVG引擎是在OpenGL之上实现的。这将在配置时检测到,QMAKE_LIBS_OPENGL将隐式添加到QMAKE_LIBS_OPENVG,无论OpenVG库链接在哪里。

如果OpenVG实现使用EGL,那么也可能需要设置QMAKE_LIBS_EGL

QMAKE_LIBS_THREAD

注意:这个变量只在Unix平台上使用。 指定构建多线程目标时需要链接的所有库。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LIBS_X11

注意:这个变量只在Unix平台上使用。 指定所有X11库。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_LIB_FLAG

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

QMAKE_LINK

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

QMAKE_LINK_SHLIB_CMD

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

QMAKE_LN_SHLIB

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

QMAKE_OBJECTIVE_CFLAGS

指定用于构建项目的Objective C/C 编译器标志。除了QMAKE_CFLAGSQMAKE_CXXFLAGS之外,还使用这些标志。

QMAKE_POST_LINK

指定将TARGET链接在一起后执行的命令。这个变量通常是空的,因此没有任何执行。 注意:这个变量对Xcode项目不起作用。

QMAKE_PRE_LINK

指定将TARGET链接在一起之前执行的命令。这个变量通常是空的,因此没有任何执行。 注意:这个变量对Xcode项目不起作用。

QMAKE_PROJECT_NAME

注意:此变量仅用于Visual Studio项目文件。 为IDE生成项目文件时,确定项目的名称。默认值是目标名称。这个变量的值通常由qmake处理,很少需要修改。

QMAKE_PROVISIONING_PROFILE

注意:此变量仅用于macOSiOStvOSwatchOS。 有效的配置文件的UUID。与QMAKE_DEVELOPMENT_TEAM一起使用来指定供应配置文件。 注意:指定供应配置文件会禁用自动管理的签名。

QMAKE_MAC_SDK

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

QMAKE_MACOSX_DEPLOYMENT_TARGET

注意:此变量仅在macOS平台上使用。 指定应用程序支持的最低硬件版本。 有关更多信息,请参阅macOS版本依赖关系。

QMAKE_MAKEFILE

指定要创建的Makefile的名称。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_QMAKE

包含qmake可执行文件的abosolute路径。 注意:不要试图覆盖这个变量的值。

QMAKE_RESOURCE_FLAGS

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

代码语言:javascript复制
QMAKE_RESOURCE_FLAGS  = -threshold 0 -compress 9

QMAKE_RPATHDIR

注意:这个变量只在Unix平台上使用。 指定链接时添加到可执行文件的库路径列表,以便在运行时优先搜索路径。 当指定相对路径时,qmake将把它们转换成动态链接器所理解的形式,以相对于引用的可执行文件或库的位置。这仅受某些平台(目前基于LinuxDarwin的平台)的支持,可通过检查是否设置QMAKE_REL_RPATH_BASE来检测。

QMAKE_RPATHLINKDIR

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

QMAKE_RUN_CC

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

QMAKE_RUN_CC_IMP

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

QMAKE_RUN_CXX

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

QMAKE_RUN_CXX_IMP

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

QMAKE_SONAME_PREFIX

如果已定义,则将此变量的值用作要构建的共享库的SONAME标识符的前缀。 SONAME是动态连接器稍后将用于引用库的标识符。通常这个参考可以是一个库名或完整的库路径。在macOSiOStvOSwatchOS上,可以使用以下占位符相对地指定路径:

占位符

影响

@rpath

扩展到由当前进程可执行文件或引用库中的LC_RPATH mach-o命令定义的路径。

@executable_path

扩展到当前进程的可执行位置。

@loader_path

扩展到引用的可执行文件或库位置。

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

代码语言:javascript复制
# <project root>/project.pro
QMAKE_SONAME_PREFIX = @rpath

但是,也可以使用不同的占位符或绝对路径来指定前缀,例如以下之一:

代码语言:javascript复制
# <project root>/project.pro
QMAKE_SONAME_PREFIX = @executable_path/../Frameworks
QMAKE_SONAME_PREFIX = @loader_path/Frameworks
QMAKE_SONAME_PREFIX = /Library/Frameworks

有关更多信息,请参阅动态库安装名称上的dyld文档。

QMAKE_TARGET

指定项目目标的名称。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

QMAKE_TARGET_COMPANY

仅限Windows。指定项目目标的公司;这适用于将公司名称放在应用程序的属性中。这只有在VERSIONRC_ICONS变量被设置并且RC_FILERES_FILE变量没有被设置时才被使用。

QMAKE_TARGET_DESCRIPTION

仅限Windows。指定项目目标的描述;这适用于在应用程序的属性中描述的情况。这只有在VERSIONRC_ICONS变量被设置并且RC_FILERES_FILE变量没有被设置时才被使用。

QMAKE_TARGET_COPYRIGHT

仅限Windows。指定项目目标的版权信息;这适用于将版权信息放入应用程序的属性中。这只有在VERSIONRC_ICONS变量被设置并且RC_FILERES_FILE变量没有被设置时才被使用。

QMAKE_TARGET_PRODUCT

仅限Windows。指定项目目标的产品;这适用于将产品放入应用程序的属性中。这只有在VERSIONRC_ICONS变量被设置并且RC_FILERES_FILE变量没有被设置时才被使用。

QMAKE_TVOS_DEPLOYMENT_TARGET

注意:此变量仅在tvOS平台上使用。 指定应用程序支持的tvOS的最低硬件版本。 有关更多信息,请参阅表达支持的iOS版本。

QMAKE_WATCHOS_DEPLOYMENT_TARGET

注意:此变量仅用于watchOS平台。 指定应用程序支持的最低版本的watchOS。 有关更多信息,请参阅表达支持的iOS版本。

QT

指定您的项目使用的Qt模块。有关为每个模块添加的值,请参阅模块文档。 默认情况下,QT包含coregui,确保可以在不进行进一步配置的情况下构建标准GUI应用程序。 如果你想建立一个没有Qt GUI模块的项目,你需要用"-="运算符来排除gui值。下面的代码会产生一个最小的Qt项目:

代码语言:javascript复制
QT -= gui # Only the core module is used.

如果您的项目是一个Qt Designer插件,请使用uiplugin值来指定该项目将被构建为一个库,但是具有对Qt Designer的特定插件支持。有关更多信息,请参阅构建和安装插件。

QTPLUGIN

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

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

当链接到Qt的共享/动态构建或链接库时,此变量当前不起作用。它可能用于稍后部署动态插件。

QT_VERSION

包含当前版本的Qt。

QT_MAJOR_VERSION

包含当前主要版本的Qt。

QT_MINOR_VERSION

包含当前的Qt小版本。

QT_PATCH_VERSION

包含Qt的当前补丁版本。

RC_FILE

指定应用程序的资源文件的名称。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。

RC_CODEPAGE

仅限Windows。指定应在生成的.rc文件中指定的代码页。这只有在VERSIONRC_ICONS变量被设置并且RC_FILERES_FILE变量没有被设置时才被使用。

RC_DEFINES

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

代码语言:javascript复制
RC_DEFINES  = USE_MY_STUFF

RC_ICONS

仅限Windows。指定应包含在生成的.rc文件中的图标。这只有在RC_FILERES_FILE变量没有被设置的情况下才被使用。有关.rc文件生成的更多细节可以在Platform Notes中找到。

RC_LANG

仅限Windows。指定应在生成的.rc文件中指定的语言。这只有在VERSIONRC_ICONS变量被设置并且RC_FILERES_FILE变量没有被设置时才被使用。

RC_INCLUDEPATH

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

RCC_DIR

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

代码语言:javascript复制
unix:RCC_DIR = ../myproject/resources
win32:RCC_DIR = c:/myproject/resources

REQUIRES

指定作为条件评估的值列表。如果任何一个条件是错误的,qmake在构建时跳过这个项目(及其SUBDIRS)。 注意:如果您想在构建时跳过项目或子项目,我们建议使用require()函数。

RESOURCES

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

RES_FILE

指定目标的已编译Windows资源文件的名称。这个变量的值通常由qmakeqmake.conf处理,很少需要修改。 来源 指定项目中所有源文件的名称。 例如:

代码语言:javascript复制
SOURCES = myclass.cpp 
        login.cpp 
        mainwindow.cpp

SUBDIRS

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

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

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

代码语言:javascript复制
  SUBDIRS = kernel 
            tools 
            myapp

如果您需要确保子目录按照指定的顺序构建,请更新CONFIG变量以包含已排序的选项:

代码语言:javascript复制
  CONFIG  = ordered

可以通过给SUBDIRS元素提供额外的修饰符来修改SUBDIRS的默认行为。支持的修饰符是:

修改

影响

.subdir

使用指定的子目录而不是SUBDIRS值。

.file

明确指定子项目专业文件。不能与.subdir修饰符一起使用。

.depends

这个子项目依赖于指定的子项目。

.makefile

子项目的makefile。仅在使用makefile的平台上可用。

.target

用于与此子项目相关的makefile目标的基本字符串。仅在使用makefile的平台上可用。

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

代码语言:javascript复制
SUBDIRS  = my_executable my_library
my_executable.subdir = app
my_executable.depends = my_library
my_library.subdir = lib

TARGET 指定目标文件的名称。包含默认项目文件的基本名称。 例如:

代码语言:javascript复制
TEMPLATE = app
TARGET = myapp
SOURCES = main.cpp

上面的项目文件会在Windows上产生一个名为myapp的可执行文件,在UNIX上是myapp.exe

TARGET_EXT

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

TARGET_x

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

TARGET_x.y.z

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

TEMPLATE

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

选项

描述

app

为构建应用程序创建一个Makefile(默认)。有关更多信息,请参阅构建应用程序

lib

为构建库创建一个Makefile。有关更多信息,请参阅建立图书馆。

subdirs

创建一个用于在子目录中构建目标的Makefile。子目录是使用SUBDIRS变量指定的。

aux

创建一个Makefile,不建造任何东西。如果不需要调用编译器来创建目标,请使用此方法,例如因为您的项目是使用解释型语言编写的。注意:此模板类型仅适用于基于Makefile的生成器。特别是,它不会与vcxproj和Xcode生成器一起工作。

vcapp

仅限Windows。为Visual Studio创建一个应用程序项目。有关更多信息,请参阅创建Visual Studio项目文件。

vclib

仅限Windows。为Visual Studio创建一个库项目。

例如:

代码语言:javascript复制
TEMPLATE = lib
SOURCES = main.cpp
TARGET = mylib

通过使用-t命令行选项指定新的模板类型,可以覆盖该模板。在.pro文件处理完成后,这将覆盖模板类型。对于使用模板类型来确定项目构建方式的.pro文件,有必要在命令行上声明TEMPLATE而不是使用-t选项。

TRANSLATIONS

指定包含用户界面文本翻译成非本地语言的翻译(.ts)文件的列表。 有关Qt的国际化(i18n)和本地化(l10n)的更多信息,请参阅Qt语言学手册。

UI_DIR

指定来自uic的所有中间文件应放置的目录。 例如:

代码语言:javascript复制
unix:UI_DIR = ../myproject/ui
win32:UI_DIR = c:/myproject/ui

VERSION

如果指定了应用程序模板,则指定应用程序的版本号,如果指定了lib模板,则指定该库的版本号。

Windows上,如果未设置RC_FILERES_FILE变量,则会触发自动生成.rc文件。生成的.rc文件将包含FILEVERSIONPRODUCTVERSION条目,其中包含主要,次要,修补程序级别和内部版本号。每个数字必须在0到65535的范围内。有关.rc文件生成的更多细节可以在Platform Notes中找到。

例如:

代码语言:javascript复制
win32:VERSION = 1.2.3.4 # major.minor.patch.build
else:VERSION  = 1.2.3   # major.minor.patch

VERSION_PE_HEADER

仅限Windows。指定Windows链接程序通过/VERSION选项将其放入.exe.dll文件的标头中的版本号。只能指定主要和次要版本。如果未设置VERSION_PE_HEADER,则会从VERSION(如果已设置)回退到主版本和次版本。

代码语言:javascript复制
VERSION_PE_HEADER = 1.2

VER_MAJ

如果指定了lib模板,则指定库的主要版本号。

VER_MIN

如果指定了lib模板,则指定该库的次要版本号。

VER_PAT

如果指定了lib模板,则指定库的补丁版本号。

VPATH

告诉qmake在哪里搜索无法打开的文件。例如,如果qmake查找SOURCES并找到无法打开的条目,则查看整个VPATH列表以查看它是否可以自行查找该文件。 另请参阅DEPENDPATH

WINRT_MANIFEST

指定要在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

标志图像文件的大小30×30像素。这在Windows Phone上不受支持。

logo_41x41

标志图像文件的大小41×41像素。这仅在Windows Phone上受支持。

logo_70x70

标志图像文件的大小70×70像素。这在Windows Phone上不受支持。

logo_71x71

标志图像文件的大小71×71像素。这仅在Windows Phone上受支持。

logo_150x150

标志图像文件的大小为150×150像素。这在所有Windows应用商店应用平台上都受支持。

logo_310x150

标志图像文件的大小为310×150像素。这在所有Windows应用商店应用平台上都受支持。

logo_310x310

标志图像文件的大小为310×310像素。这在所有Windows应用商店应用平台上都受支持。

logo_620x300

初始屏幕图像文件的大小为620×300像素。这在Windows Phone上不受支持。

logo_480x800

标志图像文件的大小为480×800像素。这仅在Windows Phone上受支持。

logo_large

标志图像文件。这必须是150×150像素。在所有Windows应用商店应用平台上受支持默认由mkspec提供。

logo_medium

中等标志图像文件。对于Windows Phone,图像的像素大小必须为71×71,对于其他Windows应用商店应用平台70×70。默认由mkspec提供。

logo_small

小徽标图像文件。对于Windows Phone,对于其他Windows应用商店应用平台30×30,图像的像素大小必须为44×44。默认由mkspec提供。

logo_splash

初始屏幕图像文件。对于Windows Phone,图像的像素大小必须为480×800,对于其他Windows应用商店应用平台620×300。默认由mkspec提供。

logo_store

Windows商店的徽标图像文件。默认由mkspec提供。

logo_wide

宽的标志图像文件。这必须是310×150像素。在所有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

您可以使用这些值的任意组合。 例如:

代码语言:javascript复制
WINRT_MANIFEST.publisher = MyCompany
WINRT_MANIFEST.logo_store = someImage.png
WINRT_MANIFEST.capabilities  = internetClient
WINRT_MANIFEST.capabilities_device  = location

另外,可以使用WINRT_MANIFEST指定输入清单文件。 例如:

代码语言:javascript复制
WINRT_MANIFEST = someManifest.xml.in

如果输入的清单文件不能被处理,只能拷贝到目标目录,那么需要设置逐字记录配置。

代码语言:javascript复制
WINRT_MANIFEST = someManifest.xml.in
WINRT_MANIFEST.CONFIG  = verbatim

注意logo_smalllogo_mediumlogo_large所需的图像大小取决于目标平台。如果提供了指定尺寸的描述,则一般描述将被覆盖。

YACCSOURCES

指定要包含在项目中的Yacc源文件的列表。 所有的依赖项,头文件和源文件将自动包含在项目中。 例如:

代码语言:javascript复制
YACCSOURCES = moc.y

_PRO_FILE_

包含正在使用的项目文件的路径。 例如,下面的行将导致项目文件的位置写入控制台:

代码语言:javascript复制
message($$_PRO_FILE_)

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

_PRO_FILE_PWD_

包含包含正在使用的项目文件的目录的路径。 例如,以下行将导致包含项目文件的目录的位置写入控制台:

代码语言:javascript复制
message($$_PRO_FILE_PWD_)

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

替换函数

qmake提供了在配置过程中处理变量内容的函数。这些功能被称为替换功能。通常,它们返回可以分配给其他变量的值。您可以通过给$$操作符添加一个前缀来获得这些值。替换函数可以分为内置函数和函数库。 另请参阅测试功能。

内置替换功能

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

absolute_path(path[, base]

返回路径的绝对路径。 如果未指定base,则使用当前目录作为基本目录。 例如,以下调用返回字符串“/home/johndoe/myproject/readme.txt”

代码语言:javascript复制
message($$absolute_path("readme.txt","/home/johndoe/myproject"))

另请参阅clean_path()relative_path()

basename(variablename)

返回在变量名中指定的文件的基本名称。 例如:

代码语言:javascript复制
FILE = /etc/passwd
FILENAME = $$basename(FILE) #passwd

cat(filename[, mode])

返回文件名的内容。您可以为模式指定以下选项:

  • blob会将文件的全部内容作为一个值返回
  • 行将每行作为单独的值返回(没有行尾)
  • true(默认值)和false返回文件内容作为单独的值,按照qmake值列表分割规则分割(如在变量赋值中)。如果mode为false,那么仅包含换行符的值将被插入到列表中,以指示文件中换行的位置。

clean_path(path)

返回目录分隔符标准化(转换为“/”)的路径,删除多余的目录分隔符,然后解析“.”“..”(尽可能)。这个函数是QDir :: cleanPath的一个包装。 另请参见absolute_path()relative_path()``,shell_path()system_path()

dirname(file)

返回指定文件的目录名称部分。例如:

代码语言:javascript复制
FILE = /etc/X11R6/XF86Config
DIRNAME = $$dirname(FILE) #/etc/X11R6

enumerate_vars

返回所有已定义变量名称的列表。

escape_expand(arg1 [, arg2 …, argn])

接受任意数量的参数。它为每个参数展开转义序列nrt并以列表形式返回参数。 注意:如果指定字符串进行字面扩展,则需要转义反斜杠,如下面的代码片段所示:

代码语言:javascript复制
message("First line$$escape_expand(\n)Second line")

find(variablename, substr)

返回与正则表达式substr匹配的变量名中的所有值。

代码语言:javascript复制
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‘。

files(pattern[, recursive=false])

扩展指定的通配符模式并返回文件名列表。如果递归是真的,这个函数下降到子目录。

first(variablename)

返回variablename的第一个值。 例如,以下调用返回firstname

代码语言:javascript复制
CONTACT = firstname middlename surname phone
message($$first(CONTACT))

另请参阅take_first()last()

format_number(number[, options…])

以选项指定的格式返回数字。您可以指定以下选项:

  • ibase = n将输入的基数设置为n
  • obase = n将输出的基数设置为n
  • width = n将输出的最小宽度设置为n。如果输出比宽度短,则用空格填充
  • zeropad用零填充输出而不是空格
  • padsign在输出中预留一个空间到正值
  • alwayssign在输出中将正号预先设置为正值
  • leftalign将填充放置在输出中值的右侧

目前不支持浮点数。 例如,以下调用将十六进制数字BAD转换为002989:

代码语言:javascript复制
message($$format_number(BAD, ibase=16 width=6 zeropad))

fromfile(filename, variablename)

评估文件名为一个qmake项目文件,并返回分配给variablename的值。 另请参见infile()

getenv(variablename)

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

join(variablename, glue, before, after)

连接加入变量名的值。如果这个值不是空的,这个函数在variablename添加前后缀值。 variablename是唯一必需的字段,其他字符串默认为空字符串。如果你需要在glue中编码空格,之前或之后,你必须引用它。

last(variablename)

返回variablename的最后一个值。 例如,以下通话返回电话:

代码语言:javascript复制
CONTACT = firstname middlename surname phone
message($$last(CONTACT))

另请参阅take_last()first()

list(arg1 [, arg2 …, argn])

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

代码语言:javascript复制
for(var, $$list(foo bar baz)) {
    ...
}

代替:

代码语言:javascript复制
values = foo bar baz
for(var, values) {
    ... 
}

lower(arg1 [, arg2 …, argn])

采取任意数量的参数并将其转换为小写。 另请参阅upper()

member(variablename [, start [, end]])

返回开始和结束(inclusive)之间从零开始的元素索引的变量名列表值的切片。

如果没有开始,它默认为零。这个用法相当于$$first(variablename)。 如果没有给出结束,则默认开始。这个用法表示简单的数组索引,就像返回一个元素一样。

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

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

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

如果结束小于开始,元素将以相反的顺序返回。

注意:结束索引是包含性的和无序的这一事实意味着只有当索引是无效的(输入变量是空的)才会返回一个空列表。 另请参阅str_member()

num_add(arg1 [, arg2 …, argn])

采取任意数量的数字参数并将其相加,返回总和。

由于可以简单地将一个减号前置到一个数值来否定它,所以隐式支持减法:

代码语言:javascript复制
sum = $$num_add($$first, -$$second)

如果操作数可能已经是负数,则需要另一个步骤来正常化数字:

代码语言:javascript复制
second_neg = -$$second
second_neg ~= s/^--//
sum = $$num_add($$first, $$second_neg)

prompt(question [, decorate])

显示指定的问题,并返回从标准输入读取的值。 如果装饰是真的(默认),问题得到一个通用的前缀和后缀标识为提示。

quote(string)

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

re_escape(string)

返回带有反斜杠的特殊正则表达式字符的字符串。这个函数是QRegExp :: escape的一个包装。

relative_path(filePath[, base])n>

返回filePath相对于base的路径。如果没有指定base,则是当前的项目目录。这个函数是QDir :: relativeFilePath的一个封装。 另请参阅absolute_path()clean_path()

replace(string, old_string, new_string)

用作为字符串提供的变量内容中的new_string替换old_string的每个实例。例如,代码

代码语言:javascript复制
MESSAGE = This is a tent.
message($$replace(MESSAGE, tent, test)

打印消息:

这是一个测试。

sprintf(string, arguments…)

使用在逗号分隔的函数参数列表中传递的参数来替换%1-%9,并返回已处理的字符串。

resolve_depends(variablename, prefix)

这是您通常不需要的内部函数。

reverse(variablename)

以相反顺序返回variablename的值。

section(variablename, separator, begin, end)

返回variablename的值的一部分。这个函数是QString :: section的一个包装。 例如,以下呼叫输出姓:

代码语言:javascript复制
CONTACT = firstname:middlename:surname:phone
message($$section(CONTACT, :, 2, 2))

shadowed(path)

将项目源目录中的路径映射到构建目录。此函数返回源内构建的路径。如果路径指向源树之外,它将返回一个空字符串。

shell_path(path)

将路径中的所有目录分隔符转换为与构建项目时使用的shell(即,由make工具调用的shell)兼容的分隔符。例如,在使用Windows外壳程序时,斜杠会转换为反斜杠。 另请参阅system_path()

shell_quote(arg)

引用arg用于构建项目时使用的shell。 另请参阅system_quote()

size(variablename)

返回变量名的值的数量。 另请参阅str_size|()

sort_depends(variablename, prefix)

这是您通常不需要的内部函数。

sorted(variablename)

返回变量名中的值列表,其中条目按照ASCII升序排序。 数值排序可以通过在format_number()函数的帮助下将值填充到固定长度来完成。

split(variablename, separator)

variablename的值拆分为不同的值,并将其作为列表返回。这个函数是QString :: split的一个包装。 例如:

代码语言:javascript复制
CONTACT = firstname:middlename:surname:phone
message($$split(CONTACT, :))

str_member(arg [, start [, end]])

这个函数和member()是一样的,不同的是它使用字符串值而不是列表变量,因此索引指向字符位置。

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

代码语言:javascript复制
# $$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()

str_size(arg)

返回参数中的字符数。 另请参阅size()

system(command[, mode[, stsvar]])

你可以使用这个系统函数的变体来从命令中获得stdout,并把它分配给一个变量。 例如:

代码语言:javascript复制
UNAME = $$system(uname -s)
contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me )

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

system_path(path)

将路径中的所有目录分隔符转换为与由system()函数用来调用命令的shell兼容的分隔符。例如,斜杠转换为Windows外壳的反斜杠。 另请参阅shell_path()

system_quote(arg)

引用arg表示由system()函数使用的shell。 另请参阅shell_quote()

take_first(variablename)

返回variablename的第一个值,并将其从源变量中移除。 例如,这为实现队列提供了便利。 另请参阅take_last()first()

take_last(variablename)

返回variablename的最后一个值,并将其从源变量中移除。 例如,这为实现堆栈提供了便利。 另请参阅take_first()last()

unique(variablename)

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

代码语言:javascript复制
ARGS = 1 2 3 2 5 1
ARGS = $$unique(ARGS) #1 2 3 5

upper(arg1 [, arg2 …, argn])

采取任意数量的参数并将其转换为大写。 另请参阅lower()

val_escape(variablename)

以一种能够将它们解析为qmake代码的方式来转义variablename的值。

测试功能

测试函数返回一个布尔值,您可以在作用域的条件部分中进行测试。测试功能可以分为内置功能和功能库。 另请参阅替换功能。

内置的测试功能

基本测试功能是作为内置功能实现的。

cache(variablename, [set|add|sub][transient][super|stash], [source variablename])

这是您通常不需要的内部函数。

CONFIG(配置)

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

代码语言:javascript复制
CONFIG = debug
CONFIG  = release
CONFIG(release, debug|release):message(Release build!) #will print
CONFIG(debug, debug|release):message(Debug build!)       #no print

由于发布被认为是活动设置(对于功能解析),它将是用于生成构建文件的CONFIG。在通常的情况下,不需要第二个参数,但是对于特定的互斥测试来说,这是非常宝贵的。

contains(variablename, value)

如果变量variablename包含值,则成功;否则失败。可以为参数值指定正则表达式。 你可以使用一个范围来检查这个函数的返回值。 例如:

代码语言:javascript复制
contains( drivers, network ) {
    # drivers contains 'network'
    message( "Configuring for network build..." )
    HEADERS  = network.h
    SOURCES  = network.cpp
}

只有驱动程序变量包含值网络时才会处理作用域的内容。如果是这种情况,则会将相应的文件添加到SOURCESHEADERS变量中。

count(variablename, number)

如果变量variablename包含具有指定数量值的列表,则成功;否则失败。 该函数用于确保只有变量包含正确数量的值才能处理范围内的声明。例如:

代码语言:javascript复制
options = $$find(CONFIG, "debug") $$find(CONFIG,"release")
count(options, 2) {
    message(Both release and debug specified.)
}

debug(level, message)

检查qmake是否在指定的调试级别运行。如果是,则返回true并打印调试消息。

defined(name[, type])

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

  • 测试只检查测试功能
  • 只替换检查替换功能
  • var只检查变量

equals(variablename, value)

测试variablename是否等于字符串值。 例如:

代码语言:javascript复制
TARGET = helloworld
equals(TARGET, "helloworld") {
    message("The target assignment was successful.")
}

error(string)

这个函数永远不会返回一个值。 qmake将字符串显示为错误消息给用户并退出。此功能只能用于不可恢复的错误。

例如:

代码语言:javascript复制
error(An error has occurred in the configuration process.)

eval(string)

使用qmake语法规则计算字符串的内容并返回true。可以在字符串中使用定义和赋值来修改现有变量的值或创建新的定义。 例如:

代码语言:javascript复制
eval(TARGET = myapp) {
    message($$TARGET)
}

注意:引号可以用来分隔字符串,如果不需要,可以丢弃返回值。

exists(filename)

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

代码语言:javascript复制
exists( $(QTDIR)/lib/libqt-mt* ) {
    message( "Configuring for multi-threaded Qt..." )
    CONFIG  = thread
}

注意:无论使用哪个平台,都应该使用“/”作为目录分隔符。

export(variablename)

将函数的本地上下文中的变量名的当前值导出到全局上下文中。

for(iterate, list)

开始一个循环遍历列表中的所有值,依次设置迭代到每个值。为了方便,如果列表是1..10,那么迭代将遍历值1到10。 例如:

代码语言:javascript复制
LIST = 1 2 3
for(a, LIST):exists(file.$${a}):message(I see a file.$${a}!)

greaterThan(variablename, value)

测试变量名的值是否大于值。首先,这个函数试图进行数值比较。如果至少有一个操作数未能转换,则该函数进行字符串比较。 例如:

代码语言:javascript复制
ANSWER = 42
greaterThan(ANSWER, 1) {
    message("The answer might be correct.")
}

直接比较两个数字是不可能的。作为解决方法,使用非数字前缀构造临时值并比较这些值。 例如:

代码语言:javascript复制
VALUE = 123
TMP_VALUE = x$$VALUE
greaterThan(TMP_VALUE, x456): message("Condition may be true.")

另请参阅lessThan()

f(condition)

评估条件。它用于分组布尔表达式。 例如:

代码语言:javascript复制
if(linux-g  *|macx-g  *):CONFIG(debug, debug|release) {
    message("We are on Linux or Mac OS, and we are in debug mode.")
}

include(filename)

将包含文件名的文件的内容包含在当前项目中。如果包含文件名,则此函数成功;否则失败。包含的文件被立即处理。 您可以使用此函数作为范围的条件来检查文件是否包含在内。例如:

代码语言:javascript复制
include( shared.pri )
OPTIONS = standard custom
!include( options.pri ) {
    message( "No custom build options specified" )
    OPTIONS -= custom
}

infile(filename, var, val)

如果文件的文件名(当由qmake自己解析时)包含变量var的值为val,则成功;否则失败。如果不指定val,则函数将测试是否在文件中分配了var

isActiveConfig

这是CONFIG功能的别名。

isEmpty(variablename)

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

代码语言:javascript复制
isEmpty( CONFIG ) {
    CONFIG  = warn_on debug
}

isEqual

这是equals函数的别名。

lessThan(variablename, value)

测试variablename的值是否小于值。作为greaterThan()。 例如:

代码语言:javascript复制
ANSWER = 42
lessThan(ANSWER, 1) {
    message("The answer might be wrong.")
}

load(feature)

加载功能指定的功能文件(.prf),除非功能已经加载。

log(message)

在控制台上打印消息。与消息函数不同,既不会预先输出文本,也不会附加换行符。 另请参阅message()

message(string)

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

代码语言:javascript复制
message( "This is a message" )

上面的行导致“这是一条消息”被写入控制台。使用引号是可选的,但建议使用。

注意:默认情况下,对于给定的项目,为qmake生成的每个Makefile写出消息。如果要确保每条项目只显示一次消息,请在构建过程中结合使用示例来测试build_pass变量以过滤消息。例如:

代码语言:javascript复制
!build_pass:message( "This is a message" )

mkpath(dirPath)

创建目录路径dirPath。这个函数是QDir :: makepath函数的一个包装。

requires(condition)

评估条件。如果条件为false,则在构建时,qmake跳过此项目(及其SUBDIRS)。 注意:您也可以使用REQUIRES变量来达到这个目的。但是,我们建议使用此功能。

system(command)

在辅助shell中执行给定的命令。如果命令以零退出状态返回,则成功;否则失败。你可以使用一个范围来检查这个函数的返回值。 例如:

代码语言:javascript复制
system("ls /bin"): HAS_BIN = TRUE

另请参阅替换system()的变体。

touch(filename, reference_filename)

更新文件名的时间戳以匹配reference_filename的时间戳。

unset(variablename)

从当前上下文中删除variablename。 例如:

代码语言:javascript复制
NARF = zort
unset(NARF)
!defined(NARF, var) {
    message("NARF is not defined.")
}

warning(string)

始终成功,并将字符串显示为警告消息给用户。

write_file(filename, [variablename, [mode]])

variablename的值写入名称为filename的文件中,每个值分别放在一行中。如果未指定variablename,则创建一个空文件。如果模式被追加并且文件已经存在,则附加到该文件而不是替换它。

Test Function Library

复杂的测试功能在.prf文件库中实现。

packagesExist(packages)

使用PKGCONFIG机制来确定在解析项目时是否存在给定的包。 这可以有选择地启用或禁用功能。例如:

代码语言:javascript复制
packagesExist(sqlite3 QtNetwork QtDeclarative) {
    DEFINES  = USE_FANCY_UI
}

然后,在代码中:

代码语言:javascript复制
#ifdef USE_FANCY_UI
// Use the fancy UI, as we have extra packages available
#endif

prepareRecursiveTarget(target)

通过准备遍历所有子目录的目标,促进创建类似于安装目标的项目范围目标。例如:

代码语言:javascript复制
TEMPLATE = subdirs
SUBDIRS = one two three
prepareRecursiveTarget(check)

具有在.CONFIG中指定的has_no_defaultno_<target>_target的子目录从此目标中排除:

代码语言:javascript复制
two.CONFIG  = no_check_target

您必须手动将准备好的目标添加到QMAKE_EXTRA_TARGETS

代码语言:javascript复制
QMAKE_EXTRA_TARGETS  = check

为了使目标具有全局性,上面的代码需要包含在每个子项目中。另外,要使这些目标做任何事情,非子项目子项目都需要包含各自的代码。最简单的方法是创建一个自定义功能文件。例如:

代码语言:javascript复制
# <project root>/features/mycheck.prf
equals(TEMPLATE, subdirs) {
    prepareRecursiveTarget(check)
} else {
    check.commands = echo hello user
}
QMAKE_EXTRA_TARGETS  = check

特征文件需要注入到每个子项目中,例如.qmake.conf

代码语言:javascript复制
# <project root>/.qmake.conf
CONFIG  = mycheck

qtCompileTest(test)

建立一个测试项目。如果测试通过,则返回true,并将config_<test>添加到CONFIG变量。否则,返回false。 要使此功能可用,您需要加载相应的功能文件:

代码语言:javascript复制
# <project root>/project.pro
load(configure)

这也将变量QMAKE_CONFIG_TESTS_DIR设置为项目父目录的config.tests子目录。加载特征文件后,可以覆盖此值。 在tests目录下,每个测试必须有一个包含简单的qmake项目的子目录。以下代码片段说明了该项目的.pro文件:

代码语言:javascript复制
# <project root>/config.tests/test/test.pro
SOURCES = main.cpp
LIBS  = -ltheFeature
# Note that the test project is built without Qt by default.

以下代码片段说明了该项目的主要.cpp文件:

代码语言:javascript复制
// <project root>/config.tests/test/main.cpp
#include <TheFeature/MainHeader.h>
int main() 
{ 
    return featureFunction(); 
}

以下代码片段显示了测试的调用:

代码语言:javascript复制
# <project root>/project.pro
qtCompileTest(test)

如果测试项目建成成功,测试通过。

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

要抑制重新使用缓存结果,请将CONFIG = recheck传递给qmake。 另请参阅load()

qtHaveModule(name)

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144388.html原文链接:https://javaforall.cn

0 人点赞