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

今天整理了一套Qt 打包部署方案,从 windeployqt 到 Inno Setup 安装,再到版本迭代的自动化,一步到位。

第一步:windeployqt

windeployqt 是 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]
AppName=YourApp
AppVersion=1.0.0
DefaultDirName={pf}\YourCompany\YourApp
DefaultGroupName=YourApp
OutputDir=..\packages
OutputBaseFilename=Setup_YourApp_1.0.0
Compression=lzma2
SolidCompression=yes
//静默安装模式的关键参数
PrivilegesRequired=admin
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 下写数据,必须强制 `PrivilegesRequired=admin`,否则 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@` 占位,比如:

AppVersion=@APP_VERSION@
OutputBaseFilename=Setup_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_STR`,C++ 代码和 Inno Setup 都从这里读取,保证万无一失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值