qt_generate_deploy_app_script
为应用程序生成部署脚本。
该命令定义在Qt6 包的Core 组件中,可按以下方式加载:
find_package(Qt6 REQUIRED COMPONENTS Core)该命令于 Qt 6.3 版本中引入。
注意:该 命令目前仅支持 Windows、macOS 和 Linux 系统。
语法
qt_generate_deploy_app_script(
TARGET target
OUTPUT_SCRIPT <var>
[NO_TRANSLATIONS]
[NO_COMPILER_RUNTIME]
[NO_UNSUPPORTED_PLATFORM_ERROR]
[NO_PLUGINS] # since Qt 6.10
[EXCLUDE_PLUGIN_TYPES type_or_target...] # since Qt 6.10
[INCLUDE_PLUGIN_TYPES type_or_target...] # since Qt 6.10
[EXCLUDE_PLUGINS name...] # since Qt 6.10
[INCLUDE_PLUGINS name...] # since Qt 6.10
[DEPLOY_TOOL_OPTIONS ...]
[PRE_INCLUDE_REGEXES regexes...]
[PRE_EXCLUDE_REGEXES regexes...]
[POST_INCLUDE_REGEXES regexes...]
[POST_EXCLUDE_REGEXES regexes...]
[POST_INCLUDE_FILES files...]
[POST_EXCLUDE_FILES files...]
)如果禁用了无版本命令,请改用 `qt6_generate_deploy_app_script() `。它支持与本命令相同的参数集。
说明
使用install(TARGETS)安装可执行目标时,仅会安装该目标的可执行文件(macOS 应用程序包除外,该情况会复制整个包)。您需要自行显式安装该可执行文件所依赖的任何其他库或插件。qt_generate_deploy_app_script() 是一条便捷命令,旨在简化该过程。 该命令要求应用程序尽可能严格遵循 Qt 推荐的安装目录结构。该结构基于 CMake 的默认安装布局(由GNUInstallDirs确定),但 macOS 应用程序包除外,它们遵循 Apple 的要求。
该命令会生成一个脚本,其名称将存储在由OUTPUT_SCRIPT 选项指定的变量中。该脚本仅在 CMake 生成时写入。它旨在与install(SCRIPT)命令配合使用,该命令应在通过install(TARGETS) 安装应用程序目标之后执行。
该部署脚本将调用qt_deploy_runtime_dependencies(),并为标准安装布局提供一组合适的选项。目前,此功能仅针对
- 在 macOS 主机上构建的 macOS 应用程序包,
- 在 Linux 主机上构建的 Linux 可执行文件,
- 以及在 Windows 主机上构建的 Windows 可执行文件。
在 Linux 主机上交叉构建 Windows 可执行文件以及类似场景目前尚不支持。在此类情况下调用 `qt_generate_deploy_app_script() ` 将导致致命错误,除非指定了 `NO_UNSUPPORTED_PLATFORM_ERROR ` 选项。
在 macOS 以外的平台上,Qt 翻译会自动部署。若要禁用此行为,请指定NO_TRANSLATIONS 。若需以自定义方式部署翻译,请使用qt_deploy_translations()。
对于 Windows 桌面应用程序,编译器所需的运行时文件也会默认安装。若要阻止此行为,请指定 `NO_COMPILER_RUNTIME`。
从 Qt 6.7 开始,您可以使用 `DEPLOY_TOOL_OPTIONS ` 向底层部署工具传递额外选项。此设置仅在底层部署工具为 `macdeployqt` 或 `windeployqt` 时生效。
注意: 包含空格的值 (如代码签名标识)只有在将QTP0007设置为NEW 时,才会原样传递给部署工具。若采用OLD 行为,此类值将不加引号写入生成的脚本,并在空格处被拆分——此前项目通常通过添加额外一层引号来解决此问题。 将策略设置为NEW 时,请移除此额外引用。
注意: 无版本号的 qt_generate_deploy_app_script() 会根据QTP0008的值,通过函数或宏转发其参数。在OLD 行为下,包含反斜杠或${var} 引用的值会在宏展开时被求值,因此类似foo\\.dylib 的正则表达式会丢失一层转义。这会影响DEPLOY_TOOL_OPTIONS 以及正则表达式和文件列表参数。 直接调用qt6_generate_deploy_app_script() 可避免此问题。
若要部署 QML 应用程序,请改用qt_generate_deploy_qml_app_script()。
要生成自定义部署脚本,请使用qt_generate_deploy_script()。
可以指定选项PRE_INCLUDE_REGEXES 、PRE_EXCLUDE_REGEXES 、POST_INCLUDE_REGEXES 、POST_EXCLUDE_REGEXES 、POST_INCLUDE_FILES 和POST_EXCLUDE_FILES 来控制运行时依赖项的部署。这些选项并不适用于所有平台,且会未经修改地转发给qt_deploy_runtime_dependencies()。
选项EXCLUDE_PLUGINS 、EXCLUDE_PLUGIN_TYPES 、INCLUDE_PLUGINS 和INCLUDE_PLUGIN_TYPES 用于选择 Qt 插件。有关这些选项的文档,请参阅qt_deploy_runtime_dependencies()。
您可以通过NO_PLUGINS 选项完全禁用插件部署。
示例
以下示例演示了如何使用MyApp 部署应用程序。
cmake_minimum_required(VERSION 3.16...3.22)
project(MyThings)
find_package(Qt6 REQUIRED COMPONENTS Core)
qt_standard_project_setup()
qt_add_executable(MyApp main.cpp)
install(TARGETS MyApp
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
qt_generate_deploy_app_script(
TARGET MyApp
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})以下示例展示了如何使用DEPLOY_TOOL_OPTIONS 参数向 macdeployqt 和 windeployqt 传递不同的选项。
# Pass the values on to the deploy tool unchanged, see \l {QTP0007}.
qt_policy(SET QTP0007 NEW)
set(deploy_tool_options_arg "")
if(APPLE)
set(deploy_tool_options_arg
-hardened-runtime
"-codesign=Developer ID Application: Joe Developer (1234567890)"
)
elseif(WIN32)
set(deploy_tool_options_arg --no-compiler-runtime)
endif()
qt_generate_deploy_app_script(
TARGET MyApp
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
DEPLOY_TOOL_OPTIONS ${deploy_tool_options_arg}
)
install(SCRIPT ${deploy_script})另请参阅 qt_standard_project_setup()、qt_generate_deploy_script()、qt_generate_deploy_qml_app_script()、QTP0007 和QTP0008。
© 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.