本页内容

平台说明

许多跨平台项目都可以通过 qmake 的基本配置功能来处理。然而,在某些平台上,利用平台特有的功能有时会很有帮助,甚至必不可少。qmake 支持许多此类功能,可以通过特定变量来调用这些功能,这些变量仅在相关平台上生效。

macOS、iOS、tvOS 和 watchOS

这些平台特有的功能包括对创建通用二进制文件、框架和捆绑包的支持。

源代码包与二进制包

源代码包中提供的 qmake 版本与二进制包中提供的配置略有不同,具体体现在其使用的功能规范不同。源代码包通常使用macx-g++ 规范,而二进制包通常配置为使用macx-xcode 规范。

各软件包的用户可通过在调用 qmake 时添加-spec 选项来覆盖此配置(更多信息请参阅“运行 qmake”)。例如,若要使用二进制软件包中的 qmake 在项目目录中生成 Makefile,请执行以下命令:

qmake -spec macx-g++

使用框架

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

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

LIBS += -F/path/to/framework/directory/

通过将-framework 选项和框架名称附加到LIBS变量中,即可将框架本身链接进来:

LIBS += -framework TheFramework

创建框架

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

TEMPLATE = lib
CONFIG += lib_bundle

与库相关的数据通过QMAKE_BUNDLE_DATA变量指定。该变量包含将随库包一起安装的项目,通常用于指定一组头文件,如下例所示:

FRAMEWORK_HEADERS.version = Versions
FRAMEWORK_HEADERS.files = path/to/header_one.h path/to/header_two.h
FRAMEWORK_HEADERS.path = Headers
QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS

您可以使用FRAMEWORK_HEADERS 变量来指定特定框架所需的头文件。将其附加到QMAKE_BUNDLE_DATA 变量后,即可确保这些头文件的相关信息被添加到将随库捆绑包一起安装的资源集合中。 此外,框架名称和版本由QMAKE_FRAMEWORK_BUNDLE_NAME和QMAKE_FRAMEWORK_VERSION变量指定。默认情况下,这些变量的值来自TARGET和VERSION变量。

有关应用程序和库部署的更多信息,请参阅《Qt for macOS - 部署》。

创建和移动 Xcode 项目

在 macOS 上,开发者可以从现有的 qmake 项目文件生成 Xcode 项目文件。例如:

qmake -spec macx-xcode project.pro

注意:如果 项目随后在磁盘上被移动,必须重新运行 qmake 以处理项目文件并生成新的 Xcode 项目文件。

同时支持两个构建目标

目前尚无法实现此功能,因为 Xcode 中的“活动构建配置”概念与 qmake 中的“构建目标”概念在原理上存在差异。

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

目前无法通过 qmake 生成的 Xcode 项目文件在 Xcode 配置设置中指定文件。库文件的链接方式取决于 Xcode 构建系统中“框架与库”阶段的处理机制。

此外,所选的“活动构建配置”存储在 .pbxuser 文件中,该文件由 Xcode 在首次加载时生成,并非由 qmake 创建。

Windows

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

添加 Windows 资源文件

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

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

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

通过设置系统变量VERSION和RC_ICONS 中的至少一个,即可触发 qmake 可选的自动生成功能,生成内容已正确填充的 .rc 文件。生成的 .rc 文件会自动进行编译和链接。 添加到 .rc 文件中的元素由系统变量QMAKE_TARGET_COMPANY、QMAKE_TARGET_DESCRIPTION、QMAKE_TARGET_COPYRIGHT、QMAKE_TARGET_PRODUCT、QMAKE_TARGET_ORIGINAL_FILENAME、QMAKE_TARGET_INTERNALNAME、QMAKE_TARGET_COMMENTS、QMAKE_TARGET_TRADEMARKS、QMAKE_MANIFEST、RC_CODEPAGE、RC_ICONS、RC_LANG和VERSION。

如果这些元素不够用,qmake 还提供了两个系统变量RC_FILE和RES_FILE,它们直接指向外部创建的 .rc 或 .res 文件。通过设置其中一个变量,指定文件将被链接到 EXE 或 DLL 中。

注意: 如果设置了RC_FILE或RES_FILE,qmake 将停止生成 .rc 文件。在这种情况下,qmake 不会对给定的 .rc 文件、.res 文件或 .o 文件进行任何进一步的修改;与 .rc 文件生成相关的变量将不起作用。

创建 Visual Studio 项目文件

本节介绍如何将现有的 qmake 项目导入 Visual Studio。qmake 能够根据项目文件生成一个 Visual Studio 项目,其中包含开发环境所需的所有必要信息。这可以通过将 qmake项目模板设置为vcapp (适用于应用程序项目)或vclib (适用于库项目)来实现。

此设置也可通过命令行选项实现,例如:

qmake -tp vc

若要递归生成子目录中的.vcproj 文件以及主目录中的.sln 文件,可输入:

qmake -tp vc -r

每次更新项目文件后,都需要运行 qmake 来生成更新后的 Visual Studio 项目。

注意:如果您 使用的是 Visual Studio 插件,请选择“Qt”>“从 .pro 文件导入”来导入.pro 文件。

Visual Studio 清单文件

在部署使用 Visual Studio 2005 或更高版本构建的 Qt 应用程序时,请确保正确处理应用程序链接时生成的清单文件。对于生成 DLL 的项目,此操作会自动处理。

要移除应用程序可执行文件的清单嵌入,可通过以下方式对CONFIG变量进行赋值:

CONFIG -= embed_manifest_exe

此外,通过对CONFIG 变量进行以下赋值,可以移除 DLL 的清单嵌入:

CONFIG -= embed_manifest_dll

Windows 部署指南中对此进行了更详细的讨论。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.