告别windeployqt的坑:用Inno Setup为QGC地面站打造一个靠谱的Windows安装包

张开发
2026/4/17 4:34:06 15 分钟阅读

分享文章

告别windeployqt的坑:用Inno Setup为QGC地面站打造一个靠谱的Windows安装包
告别windeployqt的坑用Inno Setup为QGC地面站打造一个靠谱的Windows安装包在Qt应用开发中尤其是像QGroundControlQGC这样的地面站软件打包发布是一个绕不开的环节。许多开发者第一次接触Qt应用打包时都会自然而然地想到windeployqt这个官方工具——它简单、直接似乎能一键解决所有依赖问题。但现实往往比理想骨感得多缺失的DLL、莫名其妙的运行时错误、在不同机器上表现不一致……这些坑相信不少Qt开发者都踩过。为什么windeployqt总让人又爱又恨根本原因在于它虽然能自动收集大部分Qt运行时依赖但对一些特殊情况处理不足比如第三方库如SDL2、特定插件的依赖或是某些系统组件的版本兼容性问题。更让人头疼的是这些问题往往不会在开发机器上暴露直到用户反馈程序打不开时才会被发现。相比之下专业的安装包制作工具如Inno Setup提供了更可靠的解决方案。它不仅能够确保所有依赖文件被正确包含还能提供标准的安装/卸载流程、自定义安装界面、注册表项设置等完整的分发功能。下面我们就来一步步构建一个真正可靠的QGC安装包。1. 为什么windeployqt不够可靠windeployqt作为Qt官方提供的部署工具其基本原理是扫描编译后的二进制文件分析其依赖的Qt模块然后自动复制这些模块所需的DLL和其他资源文件。这个设计在理想情况下确实能简化部署流程但实际应用中存在几个关键问题第三方库依赖缺失如QGC中使用的SDL2.dll这类非Qt核心库不会被自动识别插件检测不完整某些Qt插件如多媒体后端可能在运行时才加载静态分析会遗漏系统组件版本问题如VC运行时库的版本兼容性问题部署环境差异开发机上已全局安装的组件如OpenSSL不会被包含# 典型的windeployqt使用命令 windeployqt --release QGroundControl.exe即使加上--release参数上述问题依然存在。更麻烦的是这些问题往往只在目标机器上才会显现导致开发者需要反复调试、补文件效率极低。2. Inno Setup的优势与准备工作Inno Setup是一个免费的Windows安装包制作工具相比windeployqt的简单文件收集它提供了完整的安装包解决方案特性windeployqtInno Setup自动收集Qt依赖✓需手动配置处理非Qt依赖✗✓创建卸载程序✗✓自定义安装界面✗✓注册表项设置✗✓系统服务安装✗✓2.1 安装Inno Setup从官方下载页面获取最新版本运行安装程序建议勾选Inno Setup Preprocessor选项安装完成后可通过开始菜单或命令行启动ISCC.exe编译器2.2 准备QGC发布文件在开始制作安装包前我们需要准备完整的发布文件结构。建议按以下步骤操作# 创建发布目录结构 mkdir -p QGC_Installer/App mkdir -p QGC_Installer/Redist将编译好的QGC主程序和相关文件复制到App目录同时需要手动收集以下内容所有Qt依赖的DLL可从Qt安装目录的bin文件夹获取平台插件目录如platforms/qwindows.dll样式表等资源文件第三方库如SDL2.dllVC运行时安装包推荐使用Microsoft官方合并模块3. 编写Inno Setup脚本Inno Setup使用脚本语言.iss文件定义安装包行为。下面是一个针对QGC的基础脚本模板; QGC安装脚本 [Setup] AppNameQGroundControl AppVersion4.2.0 DefaultDirName{pf}\QGroundControl DefaultGroupNameQGroundControl OutputDir.\Output OutputBaseFilenameQGC_Setup Compressionlzma2 SolidCompressionyes ArchitecturesAllowedx64 ArchitecturesInstallIn64BitModex64 [Files] ; 主程序文件 Source: App\QGroundControl.exe; DestDir: {app}; Flags: ignoreversion ; Qt核心DLL Source: App\Qt5Core.dll; DestDir: {app}; Flags: ignoreversion Source: App\Qt5Gui.dll; DestDir: {app}; Flags: ignoreversion Source: App\Qt5Widgets.dll; DestDir: {app}; Flags: ignoreversion ; 平台插件 Source: App\platforms\qwindows.dll; DestDir: {app}\platforms; Flags: ignoreversion ; 第三方库 Source: App\SDL2.dll; DestDir: {app}; Flags: ignoreversion ; VC运行时 Source: Redist\VC_redist.x64.exe; DestDir: {tmp}; Flags: deleteafterinstall [Icons] Name: {group}\QGroundControl; Filename: {app}\QGroundControl.exe Name: {commondesktop}\QGroundControl; Filename: {app}\QGroundControl.exe [Run] Filename: {tmp}\VC_redist.x64.exe; Parameters: /install /quiet /norestart; StatusMsg: 正在安装VC运行时...这个脚本实现了以下功能安装主程序和相关依赖到Program Files目录创建开始菜单和桌面快捷方式静默安装VC运行时如未安装生成卸载程序入口提示实际项目中应根据你的Qt版本和使用的模块调整DLL列表。可以使用Dependency Walker工具检查完整依赖。4. 高级配置与优化基础脚本能满足简单需求但专业的分发还需要考虑更多细节。下面介绍几个关键优化点4.1 自动化依赖收集手动维护DLL列表容易出错可以结合windeployqt生成基础文件再手动补充缺失内容# 先用windeployqt生成基础文件 windeployqt --release --dir Deploy QGroundControl.exe # 然后手动复制第三方库 cp /path/to/SDL2.dll Deploy/4.2 安装前环境检测Inno Setup支持Pascal脚本可以在安装前检查系统环境[Code] function InitializeSetup(): Boolean; var Version: TWindowsVersion; begin GetWindowsVersionEx(Version); if Version.NTPlatform and (Version.Major 10) then begin MsgBox(QGC需要Windows 10或更高版本, mbError, MB_OK); Result : False; end else Result : True; end;4.3 多语言支持QGC作为全球使用的软件安装包也应支持多语言[Languages] Name: en; MessagesFile: compiler:Default.isl Name: zh; MessagesFile: compiler:Languages\ChineseSimplified.isl [Messages] zh.BeveledLabel中文(简体)4.4 数字签名为安装包添加数字签名能增强用户信任度[Setup] SignToolmy_signtool SignedUninstalleryes [Code] procedure CurStepChanged(CurStep: TSetupStep); begin if CurStep ssPostInstall then SignTool({app}\QGroundControl.exe); end;需要在Inno Setup中预先配置签名工具或使用外部脚本进行签名。5. 常见问题与调试技巧即使使用Inno Setup打包过程中仍可能遇到各种问题。以下是几个典型场景的解决方案5.1 缺失DLL错误症状程序在目标机器上启动时报错提示缺少某个DLL。解决方法使用Dependency Walker分析所有依赖确保所有依赖DLL都包含在安装包中特别注意间接依赖的第三方库5.2 插件加载失败症状程序能启动但部分功能异常日志显示插件加载失败。解决方法检查Qt插件目录结构是否正确确保插件依赖的DLL也已部署使用QApplication::libraryPaths()调试插件搜索路径5.3 版本冲突症状程序行为与开发环境不一致可能因系统已安装不同版本依赖。解决方法在安装包中包含所有必要依赖使用应用程序本地目录优先加载策略在代码中明确指定插件路径QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() /plugins);5.4 安装包体积优化随着Qt模块增多安装包体积可能急剧膨胀。可以考虑以下优化使用UPX压缩二进制文件仅包含实际使用的Qt模块将大型资源文件设为可选组件使用7z等更高压缩率的格式[Setup] Compressionlzma2/ultra646. 持续集成与自动化对于需要频繁发布的QGC版本应该将打包过程集成到CI/CD流水线中。以下是基于GitLab CI的示例配置stages: - build - deploy build_qgc: stage: build script: - cmake -GNinja -DCMAKE_BUILD_TYPERelease .. - ninja artifacts: paths: - build/release/ create_installer: stage: deploy script: - mkdir -p deploy - cp build/release/QGroundControl.exe deploy/ - windeployqt --release --dir deploy deploy/QGroundControl.exe - cp thirdparty/SDL2.dll deploy/ - iscc /FQGC_${CI_COMMIT_SHORT_SHA} installer_script.iss dependencies: - build_qgc artifacts: paths: - Output/*.exe这个配置实现了自动编译QGC Release版本收集运行时依赖调用Inno Setup编译器生成安装包保存安装包为CI产物类似的方法也适用于Jenkins、GitHub Actions等其他CI系统。

更多文章