惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
O
OpenAI News
V
V2EX
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
S
Schneier on Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
小众软件
小众软件
L
LINUX DO - 热门话题
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - Franky
Security Latest
Security Latest
S
SegmentFault 最新的问题
Project Zero
Project Zero
Spread Privacy
Spread Privacy
K
Kaspersky official blog
J
Java Code Geeks
V
Vulnerabilities – Threatpost
C
Cisco Blogs
C
CERT Recently Published Vulnerability Notes
月光博客
月光博客
T
The Exploit Database - CXSecurity.com
L
Lohrmann on Cybersecurity
人人都是产品经理
人人都是产品经理
博客园 - 三生石上(FineUI控件)
Scott Helme
Scott Helme
WordPress大学
WordPress大学
量子位
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
AWS News Blog
AWS News Blog
Help Net Security
Help Net Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Simon Willison's Weblog
Simon Willison's Weblog
S
Secure Thoughts
博客园 - 【当耐特】
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
V
Visual Studio Blog
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
腾讯CDC
Cyberwarzone
Cyberwarzone
IT之家
IT之家
GbyAI
GbyAI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
云风的 BLOG
云风的 BLOG
T
Troy Hunt's Blog
D
Docker

博客园 - yinsua

OpenBCI调试记录 一种CAN接口电路的隔离方案 【转载】0-5V转4-20mA电路以及Howland电流源分析与仿真 【转载】外置USB供电与内置锂电池供电自动切换电路 模块的电气隔离的例子(音频采集电路) 【转载】EMC 共模电感选型 RS485的电路防护设计 ubuntu 20.04 安装VMware Tools Linux常用操作 MOS管随笔 RTX V4随笔 【转载】Keil MDK的sct分散加载文件详解 lua语言 简单类测试 Git 加入gitignore文件后应用 git报错error: could not lock config file RT-Thread速览——内核 ARM MDK开发中的\$Super\$\$main与\$Sub\$\$main - yinsua - 博客园 cpolar(内网穿透工具)安装 VSCode + EIDE开发记录
Qt QML/Quick程序部署
yinsua · 2026-01-12 · via 博客园 - yinsua

环境

  • win10 x64
  • Qt 6.10.1

自动拷贝依赖文件

使用完整windeploy.exe路径执行:例如在项目根目录下执行:
D:\Qt\6.10.1\mingw_64\bin\windeployqt.exe --release --no-translations .\build\Desktop_Qt_6_10_1_MinGW_64_bit-Release\appSerialPortAssist.exe
完成后Desktop_Qt_6_10_1_MinGW_64_bit-Release目录下会自动加入所依赖的dll文件。
注意:这里的--release代表可执行文件是在release模式下生成的,需要确保此点才能正确运行!
也可切换为--debug那么后面的exe对应就是debug模式下生成的。

生成安装部署程序

  • 前提是Qt安装时已经勾选安装了Installer Framework,如果安装了,那么可以在Qt安装目录下找到:xxx\Qt\Tools\QtInstallerFramework
  • D:\Qt\Tools\QtInstallerFramework\4.10\bin目录加入到环境变量PATH中。(这里的目录只是示例,实际版本以实际目录为准)
  • 项目根目录下新建installer目录,并将D:\Qt\Tools\QtInstallerFramework\4.10\examples\startmenu目录下的configpackages两个目录拷贝到新建的installer目录下。
  • Desktop_Qt_6_10_1_MinGW_64_bit-Release目录下的所有文件(可不要一些临时文件、cmake文件等,以及以小数点开头的文件夹)拷贝到installer\packages\org.qtproject.ifw.example\data目录下
  • 在项目根目录下打开Windows PowerShell
  • 按需修改installer\packages\org.qtproject.ifw.example\meta\package.xml文件的DisplayName标签和Description标签。
  • 按需修改installer\config\config.xml文件中的Name标签和Title标签。
  • 执行:binarycreator.exe --offline-only -c .\installer\config\config.xml -p .\installer\packages\ XXX.exe -v

详细设计可参考官方

image
image
image
image

以下内容为AI生成

你想知道在 Qt 的安装框架(Qt Installer Framework,简称 QIF)中如何添加多个安装包(package),核心是通过配置 packages 目录结构和 package.xml 文件来定义多个独立的安装组件,让用户可以选择安装不同的功能模块。

实现思路

Qt Installer Framework 中,每个 package 对应一个独立的安装组件(比如“主程序”“插件”“示例”),需要按固定目录结构组织,每个 package 都有自己的 package.xml 配置文件,最终通过 config.xml 统一管理所有 package。

一、基础目录结构

首先按以下结构创建项目(这是多 package 的核心前提):

MyInstaller/
├── config              # 全局配置目录
│   └── config.xml      # 安装器全局配置
├── packages            # 所有package存放目录
│   ├── com.mycompany.app.main  # 第一个package:主程序
│   │   ├── data        # 该package的安装文件(如exe、dll)
│   │   └── meta        # 该package的元配置
│   │       └── package.xml
│   ├── com.mycompany.app.plugin # 第二个package:插件
│   │   ├── data
│   │   └── meta
│   │       └── package.xml
│   └── com.mycompany.app.doc    # 第三个package:文档
│       ├── data
│       └── meta
│           └── package.xml
└── installerbase.exe   # QIF提供的安装器基础程序(可选)

注意:package 名称建议用「反向域名」格式(如 com.mycompany.app.main),避免命名冲突。

二、配置每个 Package(package.xml)

每个 package 的 meta/package.xml 定义该组件的名称、描述、依赖、是否可选等属性,以下是 3 个示例:

1. 主程序 package(com.mycompany.app.main/meta/package.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Package>
    <DisplayName>主程序</DisplayName>  <!-- 安装界面显示的名称 -->
    <Description>核心应用程序,必须安装</Description>
    <Version>1.0.0</Version>          <!-- 版本号 -->
    <ReleaseDate>2026-01-12</ReleaseDate>
    <Name>com.mycompany.app.main</Name> <!-- 唯一标识,和目录名一致 -->
    <Script>installscript.qs</Script> <!-- 可选:安装脚本(如自定义逻辑) -->
    <Default>true</Default>           <!-- 默认勾选 -->
    <Required>true</Required>         <!-- 必装组件(用户无法取消) -->
    <SortingPriority>100</SortingPriority> <!-- 安装界面显示优先级(数值大在前) -->
</Package>

2. 插件 package(com.mycompany.app.plugin/meta/package.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Package>
    <DisplayName>扩展插件</DisplayName>
    <Description>额外功能插件,可选安装</Description>
    <Version>1.0.0</Version>
    <ReleaseDate>2026-01-12</ReleaseDate>
    <Name>com.mycompany.app.plugin</Name>
    <Default>false</Default>          <!-- 默认不勾选 -->
    <Required>false</Required>        <!-- 可选组件 -->
    <Dependencies>com.mycompany.app.main</Dependencies> <!-- 依赖主程序 -->
    <SortingPriority>90</SortingPriority>
</Package>

3. 文档 package(com.mycompany.app.doc/meta/package.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Package>
    <DisplayName>使用文档</DisplayName>
    <Description>用户手册和API文档</Description>
    <Version>1.0.0</Version>
    <ReleaseDate>2026-01-12</ReleaseDate>
    <Name>com.mycompany.app.doc</Name>
    <Default>false</Default>
    <Required>false</Required>
    <SortingPriority>80</SortingPriority>
</Package>

三、配置全局安装器(config.xml)

config/config.xml 中声明所有 package,并配置安装器的全局属性:

<?xml version="1.0" encoding="UTF-8"?>
<Installer>
    <Name>My Qt Application</Name>    <!-- 安装器名称 -->
    <Version>1.0.0</Version>
    <Title>My Qt App 安装程序</Title>  <!-- 安装界面标题 -->
    <Publisher>My Company</Publisher> <!-- 发布者 -->
    <StartMenuDir>My Qt App</StartMenuDir> <!-- 开始菜单目录 -->
    <TargetDir>@HomeDir@/MyQtApp</TargetDir> <!-- 默认安装路径 -->
    
    <!-- 声明所有要包含的package -->
    <Package>com.mycompany.app.main</Package>
    <Package>com.mycompany.app.plugin</Package>
    <Package>com.mycompany.app.doc</Package>
</Installer>

四、填充每个 Package 的数据文件

将对应文件放入每个 package 的 data 目录:

  • com.mycompany.app.main/data:放入主程序 exe、Qt 依赖库等核心文件;
  • com.mycompany.app.plugin/data:放入插件 dll/so 文件;
  • com.mycompany.app.doc/data:放入 PDF 文档、README 等。

五、生成安装程序

使用 QIF 提供的 binarycreator 工具打包(需配置 QIF 环境变量):

# Windows 命令
binarycreator.exe -c config/config.xml -p packages MyInstaller.exe

# Linux/macOS 命令
binarycreator -c config/config.xml -p packages MyInstaller.run

前置条件:确保 Qt Installer Framework 已安装(Qt 维护工具中勾选「Qt Installer Framework」组件),且 binarycreator 所在路径(如 Qt/Tools/QtInstallerFramework/4.5/bin)已加入系统环境变量。

关键配置解释

  1. Dependencies(依赖)

    • 如插件 package 依赖主程序,用户安装插件时会自动勾选主程序;
    • 支持多个依赖,用逗号分隔:<Dependencies>pkg1,pkg2</Dependencies>
  2. Required/Default

    • Required="true":组件必装,安装界面无法取消勾选;
    • Default="true":组件可选,但默认勾选。
  3. SortingPriority

    • 数值越大,组件在安装界面的「选择组件」步骤中显示越靠前;
    • 主程序建议设为最高(如 100),次要组件依次降低。

进阶技巧

  1. 分组显示组件
    如果 package 数量多,可通过 <Group> 标签分组:

    <!-- 在 config.xml 中添加 -->
    <Groups>
        <Group>
            <Name>核心组件</Name>
            <Packages>
                <Package>com.mycompany.app.main</Package>
            </Packages>
        </Group>
        <Group>
            <Name>可选组件</Name>
            <Packages>
                <Package>com.mycompany.app.plugin</Package>
                <Package>com.mycompany.app.doc</Package>
            </Packages>
        </Group>
    </Groups>
    
  2. 自定义安装逻辑
    每个 package 可添加 installscript.qs 脚本,实现自定义操作(如创建快捷方式、修改注册表):

    // com.mycompany.app.main/meta/installscript.qs
    function Component() {
        // 安装完成后创建桌面快捷方式
        Component.prototype.createOperations = function() {
            component.createOperations();
            if (systemInfo.productType === "windows") {
                addDesktopShortcut("MyQtApp.exe");
            }
        };
    }
    

总结

  1. 多 package 核心是按「反向域名」格式创建独立目录,每个目录包含 data(安装文件)和 meta/package.xml(组件配置);
  2. config.xml 全局声明所有 package,可通过 Groups 分组、Dependencies 配置依赖;
  3. 最终用 binarycreator 工具打包,生成包含多个可选组件的安装程序。

关键点:每个 package 的 Name 必须和目录名一致,Required/Default 控制组件是否必装/默认勾选,Dependencies 确保组件间的依赖关系正确。