
今天整理了一套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 都從這里讀取保證萬無一失。