Back to Blog home

减少Qt应用程序的二进制文件大小 - 第3部分:更多平台

Published on 星期三 七月 23, 2025 by Juha Vuolle in Dev Loop | Comments

在macOS、iOS、Windows、Android、WebAssembly和Linux上优化Qt构建。

第1部分 ,我们介绍了 Qt大小优化指南第2部分 介绍了Raspberry Pi(Linux)上的一个具体示例

Linux是Qt支持的众多平台之一,但在其他平台上如何优化大小呢?有些配置选项依赖于平台 ,并不总是可以在不同平台间通用

在本篇博客中,我们将介绍其他平台。主要目的是提供一些参考功能集,供您在配置中作为起点使用。

参考应用程序

在创建最小化的 Qt 配置时,您需要决定哪些功能必须保留。了解越清楚,就越能精简不必要的功能,或做出可以接受的性能或安全性取舍。为此,我们选择了几个 Qt Quick 示例应用程序,它们可以在该配置下正常运行:

  • Coffeemachine- 与之前的博客进行比较
  • Colorpalette Client --使用网络和 https
  • Gallery- 大多使用 Qt Quicker Controls
  • Calqlatr
  • Simple application(简单应用)-- 一个极简参考应用程序,仅包含一个 QML 窗口和文本元素(“Hello World”) 

平台

我们在以下六个平台上测试了配置:

代码库基于最新的 Qt dev 分支(即将发布的 Qt 6.10)。大多数为编译最小配置所需的修复也已回移合并到 Qt 6.9 Qt 6.8

结果

CI配置最能概括所生成的配置。不同平台上的配置大部分选项相同,但也存在差异

值得注意的是,大多数构建都是静态构建。静态构建意味着应用程序、Qt库和Qt插件都被编译进了一个单一可执行文件中。静态构建使编译器和链接器能够进行强有力的大小优化,因为它们可以看到整个二进制结构。Android是个例外,因为 Qt for Android 目前不支持静态构建

图例:

  • 参考:默认配置下构建的发布版本应用程序 
  • 参考已剥离:剥离符号后的参考应用程序 
  • 最小化:使用最小配置构建的应用程序
  • 最小化已剥离:剥离符号后的最小化应用程序 

MacOS (Sequoia 15.2):

Picture

iOS (18.2):

Picture

Linux (Ubuntu 24.04):

Picture

WebAssembly (emsdk 4.0.7):

Picture

值得注意的是,WebAssembly配置直接使用了 LTO (链接时优化) 链接器标志,因为Qt configure提供的-ltcg选项遇到了编译器错误。该bug最近已经得到修复,因此今后也可以在该平台上使用ltcg选项。

安卓(NDK 26.6.1):

Picture

因为 Android 的构建过程默认会剥离二进制文件,因此没有单独“剥离”版本。

Windows (11, MSVC 2022):

Picture

在 Windows 上没有单独的剥离版本,因为使用 MSVC(而非 MinGW)时,通常不使用或不需要符号剥离。

横向对比 

我们也来看下不同平台下应用程序大小的横向比较。首先是最大的应用程序: 

Colorpalette:

Picture

然后是最小的应用程序,simple app(简单应用):

Picture

在所有平台上,大小优化都有显著影响。不出所料,macOS和iOS的大小几乎完全相同。Android .apk的文件体积最大。这可能是由于缺乏静态构建支持,而打包(androiddeployqt)可能会部署比实际需要更多的组件。幸运的是,后者可以手动调整,请参阅本博文

进一步优化

我们选择了一个能确保所选参考应用程序正常运行的最小配置。但实际生产应用程序有特定需求,可以进一步优化。下面是一些例子:

  • 如果应用程序不需要网络功能,可将其禁用(这也有利于安全) 
  • 如无需要,禁用所有 quickcontrols2 样式。不仅不要构建它们,更重要的是不要导入它们

  • 禁用更多图像格式--例如,SVG支持在二进制大小拆解中是非常显著的 
  • 如果不需要,则禁用设置--设置在二进制大小拆解中也非常明显

还有更多。许多功能(如shortcuts支持)仍保留在最小配置中,这是因为参考应用程序使用了这些功能,但也许您的应用程序并不需要它们。

我禁用了一个功能, 现在Qt无法编译了

文中所示的这些配置,为了成功编译,需要做一些小的代码修复。这是可以理解的,因为编译所有可能的功能组合并不现实(理论上,这些组合比可见宇宙中的原子数还多)。

幸运的是,这些修复通常都很小且简单。 如果您配置了非标准的功能集,并遇到本应可用的功能出错时,请在 Qt Bug Tracker 上提交报告提交补丁

结论

功能选择和构建标志会极大地影响 Qt 库和应用程序的大小。越清楚了解应用程序的需求,就越能优化精简。这里介绍的最小化配置可以作为您自己精简配置的良好起点

不过,需要注意的是,体积最小化的应用程序并不适合开发阶段使用。 在开发阶段,应该保留必要的工具和调试符号。此外,使用链接时代码生成静态编译应用程序比共享编译要慢

Subscribe to Our Blog

Stay up to date with the latest marketing, sales and service tips and news.