ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Qt 程序打包部署全攻略:从 windeployqt 到 Inno Setup 的静默安装与版本迭代实战

Qt 程序打包部署全攻略:从 windeployqt 到 Inno Setup 的静默安装与版本迭代实战 今天整理了一套Qt 打包部署方案从 windeployqt 到 Inno Setup 安装再到版本迭代的自动化一步到位。第一步windeployqtwindeployqt 是 Qt 官方提供的部署工具能自动扫描你程序依赖的 Qt 模块和插件把需要的 DLL、资源文件一股脑拷贝到目标目录。但是他只能识别Qt 库第三方库比如 OpenCV、FFmpeg需要手动处理基础用法是在Qt命令行环境里执行cd /d 你的构建目录 windeployqt --release --no-translations --compiler-runtime YourApp.exe--compiler-runtime自动带上 MSVC 运行库如果用的是MinGW,这个参数会忽略但需要把 libgcc_s_seh-1.dll、libstdc-6.dll 也拷走。注意windeployqt 只能在干净的 release 目录里跑如果你的 exe 旁边有旧的 DLL它可能因为版本混淆而报错。所以每次构建前先把 deploy目录清空再重新拷贝 exe 。第二步手动补全第三方 DLL 和运行时依赖程序往往还依赖一些三方库比如串口通信用到的 FTD2XX.dll或者加密库 libcrypto-3-x64.dll。这些需要从编译环境或者 SDK 安装目录里找。我用一个环境变量来管理部署目录比如 D:\DeployRoot\YourApp然后通过脚本拷贝// 这不是代码只是一个批处理片段但 Qt 程序里我会用 QProcess 来调用它 // copy_third_party.bat copy /Y C:\SDK\FTDI\FTD2XX.dll %DEPLOY_DIR%\FTD2XX.dll copy /Y D:\openssl3\lib\libcrypto-3-x64.dll %DEPLOY_DIR%\libcrypto-3-x64.dll拷贝以后最好在 Qt 程序启动时做一个静态检查用 QLibrary::isLibrary 验证关键 DLL 是否存在不存在就直接弹窗提示缺少运行库。注意处理调试版和发布版的差异debug 的 DLL 通常带 d 后缀比如 Qt6Cored.dll打包时只拷贝 release 版本。第三步Inno Setup安装文件齐全后开始制作安装包。Inno Setup 是免费神器脚本语法简单先写一个基础脚本 installer.iss[Setup] AppNameYourApp AppVersion1.0.0 DefaultDirName{pf}\YourCompany\YourApp DefaultGroupNameYourApp OutputDir..\packages OutputBaseFilenameSetup_YourApp_1.0.0 Compressionlzma2 SolidCompressionyes //静默安装模式的关键参数 PrivilegesRequiredadmin UninstallDisplayIcon{app}\YourApp.exe [Files] //把 windeployqt 生成的整个 deploy 目录包含进来 Source: ..\deploy\*; DestDir: {app}; Flags: recursesubdirs createallsubdirs [Icons] Name: {group}\YourApp; Filename: {app}\YourApp.exe //桌面快捷方式可选我一般不创建免得客户嫌乱 [Run] //安装完成后静默启动或者不启动看需求 Filename: {app}\YourApp.exe; Parameters: --firstrun; Flags: nowait可以用命令行模式编译这个脚本ISCC.exe installer.iss生成 Setup_YourApp_1.0.0.exe点击安装即可。注意权限问题、如果你的程序要写注册表或者往 Program Files 下写数据必须强制 PrivilegesRequiredadmin否则 Win10 的 UAC 会弹窗拦截静默模式直接失败。另外安装完成后如果有驱动或服务要注册记得在 [Run] 里用 Flags: runhidden 跑你的批处理不然控制台窗口一闪而过客户以为是 bug。第四步版本迭代的自动化从 CMake 到打包每次手动执行 windeployqt 再开 Inno Setup 过于繁琐我们可以升级到 CI/CD 思路。我会使用 CMake 捕获版本号生成一个 version_info.iss 文件里面包含版本号和文件名。在 CMakeLists.txt 里加一段set(APP_VERSION 1.0.0) configure_file(${CMAKE_SOURCE_DIR}/installer.iss.in ${CMAKE_BINARY_DIR}/installer.iss ONLY)然后在 installer.iss.in 里用 APP_VERSION 占位比如AppVersionAPP_VERSION OutputBaseFilenameSetup_YourApp_APP_VERSION这样每次改代码只动一个版本号打包脚本自动变化。还可以在 CMake 里加一个自定义 target依次执行 windeployqt 和 ISCC一条命令生成安装包add_custom_target(package_app COMMAND windeployqt --release $TARGET_FILE:YourApp COMMAND ISCC.exe ${CMAKE_BINARY_DIR}/installer.iss DEPENDS YourApp )注意** 版本号别硬编码在 .pro 文件如果你用 qmake因为 CMake 和 qmake 混用会乱。统一用一个 version.h 头文件定义 APP_VERSION_STRC 代码和 Inno Setup 都从这里读取保证万无一失。
返回列表