Qt 应用程序打包部署全攻略:从可执行文件到安装包
摘要:Qt 应用开发完成后,打包部署是最后也是最关键的一步。本文详细介绍 Windows(NSIS/Installer)、Linux(AppImage/Deb)、macOS(DMG)三大平台的打包方法,以及 Qt 特有的依赖处理技巧,助你打造专业的软件安装包。
一、打包前的准备工作
1.1 构建 Release 版本
切勿使用 Debug 版本发布! Debug 版本依赖调试库,体积大且无法独立运行。
Qt Creator 设置:
plain
复制
左下角构建模式选择:Release
或命令行:qmake CONFIG+=release
1.2 静态链接 vs 动态链接
表格
方式    优点    缺点    适用场景
动态链接(默认)    体积小、可更新 Qt 库    需携带 DLL/SO 文件    大多数桌面应用
静态链接    单文件、无依赖    体积大、LGPL 协议要求    简单工具、嵌入式
静态编译配置(可选):
bash
复制
# configure 时添加
-static -prefix /path/to/qt-static
二、Windows 平台打包
2.1 使用 windeployqt 工具(官方推荐)
Qt 自带的依赖收集工具,自动复制所需 DLL、插件和翻译文件。
bash
复制
# 进入构建目录
cd release/

# 基础用法
windeployqt YourApp.exe

# 完整用法(包含所有可能依赖)
windeployqt YourApp.exe --release --no-translations --no-compiler-runtime

# 指定输出目录
windeployqt YourApp.exe --dir dist/
windeployqt 复制的内容:
Qt 核心 DLL(Qt5Core.dll, Qt5Gui.dll 等)
平台插件(platforms/qwindows.dll)
样式插件(styles/)
图像格式插件(imageformats/)
翻译文件(可选)
2.2 手动补充依赖
windeployqt 可能遗漏的依赖:
Visual C++ 运行库:msvcp140.dll, vcruntime140.dll
OpenSSL:libcrypto-1_1-x64.dll, libssl-1_1-x64.dll(网络功能)
自定义 DLL:第三方库
使用 Dependency Walker 检查依赖:
bash
复制
# 下载 Dependencies 工具(新版 Dependency Walker)
Dependencies.exe -chain YourApp.exe
2.3 制作安装包(NSIS)
NSIS(Nullsoft Scriptable Install System)是轻量级的 Windows 安装程序制作工具。
安装 NSIS: 官网下载 https://nsis.sourceforge.io/
创建安装脚本(installer.nsi):
nsis
复制
; installer.nsi
!include "MUI2.nsh"

; 基本信息
Name "MyQtApp"
OutFile "MyQtApp-Setup-v1.0.0.exe"
InstallDir "$PROGRAMFILES64\MyQtApp"
RequestExecutionLevel admin

; 界面配置
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "SimplifiedChinese"

Section "Install"
    SetOutPath "$INSTDIR"
    
    ; 复制所有文件(假设已用 windeployqt 收集到 dist 目录)
    File /r "dist\*.*"
    
    ; 创建快捷方式
    CreateDirectory "$SMPROGRAMS\MyQtApp"
    CreateShortcut "$SMPROGRAMS\MyQtApp\MyQtApp.lnk" "$INSTDIR\MyQtApp.exe"
    CreateShortcut "$DESKTOP\MyQtApp.lnk" "$INSTDIR\MyQtApp.exe"
    
    ; 写入卸载程序
    WriteUninstaller "$INSTDIR\Uninstall.exe"
    
    ; 注册表信息(控制面板显示)
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyQtApp" \
        "DisplayName" "MyQtApp"
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyQtApp" \
        "UninstallString" "$INSTDIR\Uninstall.exe"
SectionEnd

Section "Uninstall"
    Delete "$INSTDIR\Uninstall.exe"
    RMDir /r "$INSTDIR"
    Delete "$DESKTOP\MyQtApp.lnk"
    RMDir /r "$SMPROGRAMS\MyQtApp"
    DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyQtApp"
SectionEnd
编译安装包:
bash
复制
makensis.exe installer.nsi
2.4 进阶:使用 Qt Installer Framework
Qt 官方提供的安装包制作工具,支持在线更新、组件选择。
安装: 通过 Qt MaintenanceTool 安装 Qt Installer Framework
创建配置:
plain
复制
installer/
├── config/
│   ├── config.xml          # 安装包配置
│   └── logo.png
└── packages/
    └── com.yourcompany.app/
        ├── meta/
        │   ├── package.xml
        │   └── installscript.qs
        └── data/
            └── your_app_files/
config.xml:
xml
复制
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
    <Name>MyQtApp</Name>
    <Version>1.0.0</Version>
    <Title>MyQtApp 安装程序</Title>
    <Publisher>Your Company</Publisher>
    <StartMenuDir>MyQtApp</StartMenuDir>
    <TargetDir>@HomeDir@/MyQtApp</TargetDir>
</Installer>
打包命令:
bash
复制
binarycreator.exe --offline-only -c config/config.xml -p packages MyQtApp-Installer.exe
三、Linux 平台打包
3.1 通用方案:AppImage(推荐)
AppImage 是 Linux 上的"绿色软件",一个文件包含所有依赖,无需安装即可运行。
使用 linuxdeployqt 工具:
bash
复制
# 1. 下载 linuxdeployqt
wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
chmod +x linuxdeployqt-continuous-x86_64.AppImage

# 2. 准备目录结构
mkdir -p MyApp.AppDir/usr/bin
mkdir -p MyApp.AppDir/usr/lib
mkdir -p MyApp.AppDir/usr/share/applications
mkdir -p MyApp.AppDir/usr/share/icons/hicolor/256x256/apps

# 3. 复制可执行文件
cp YourApp MyApp.AppDir/usr/bin/
cp your_icon.png MyApp.AppDir/usr/share/icons/hicolor/256x256/apps/MyApp.png

# 4. 创建桌面文件
cat > MyApp.AppDir/usr/share/applications/MyApp.desktop << EOF
[Desktop Entry]
Type=Application
Name=MyQtApp
Exec=YourApp
Icon=MyApp
Categories=Development;
Comment=My Qt Application
EOF

# 5. 运行 linuxdeployqt
./linuxdeployqt-continuous-x86_64.AppImage MyApp.AppDir/usr/share/applications/MyApp.desktop -appimage

# 生成 MyQtApp-x86_64.AppImage
3.2 Debian/Ubuntu:DEB 包
bash
复制
# 创建目录结构
mkdir -p myapp-deb/DEBIAN
mkdir -p myapp-deb/usr/bin
mkdir -p myapp-deb/usr/share/applications

# 控制文件
cat > myapp-deb/DEBIAN/control << EOF
Package: myqtapp
Version: 1.0.0
Section: utils
Priority: optional
Architecture: amd64
Depends: libqt5gui5, libqt5core5a, libqt5widgets5
Maintainer: Your Name <your@email.com>
Description: My Qt Application
 A simple Qt application.
EOF

# 复制文件
cp YourApp myapp-deb/usr/bin/
cp MyApp.desktop myapp-deb/usr/share/applications/

# 构建
dpkg-deb --build myapp-deb myqtapp_1.0.0_amd64.deb
3.3 RedHat/CentOS:RPM 包
使用 rpmbuild 工具,创建 SPEC 文件后构建。
四、macOS 平台打包
4.1 使用 macdeployqt
Qt 官方提供的 macOS 依赖收集工具。
bash
复制
# 基础用法
macdeployqt YourApp.app

# 生成 DMG 镜像
macdeployqt YourApp.app -dmg

# 包含所有插件
macdeployqt YourApp.app -dmg -verbose=2
4.2 手动完善 App Bundle
App Bundle 结构:
plain
复制
YourApp.app/
└── Contents/
    ├── Info.plist          # 应用配置
    ├── MacOS/
    │   └── YourApp         # 可执行文件
    ├── Resources/
    │   ├── YourApp.icns    # 图标
    │   └── qt.conf         # Qt 配置
    ├── Frameworks/         # Qt 框架(macdeployqt 自动复制)
    └── PlugIns/            # 插件
Info.plist 示例:
xml
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleExecutable</key>
    <string>YourApp</string>
    <key>CFBundleIdentifier</key>
    <string>com.yourcompany.YourApp</string>
    <key>CFBundleName</key>
    <string>YourApp</string>
    <key>CFBundleVersion</key>
    <string>1.0.0</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleIconFile</key>
    <string>YourApp.icns</string>
</dict>
</plist>
4.3 创建 DMG 安装包
bash
复制
# 1. 创建临时目录
mkdir -p dmg_temp

# 2. 复制 App
cp -r YourApp.app dmg_temp/

# 3. 创建符号链接到 Applications
ln -s /Applications dmg_temp/Applications

# 4. 创建 DMG(使用 create-dmg 工具)
create-dmg \
  --volname "YourApp Installer" \
  --window-pos 200 120 \
  --window-size 800 400 \
  --icon-size 100 \
  --app-drop-link 600 185 \
  "YourApp-1.0.0.dmg" \
  "dmg_temp/"
五、跨平台自动化方案
5.1 使用 QMake/CMake 自动打包
CMake 示例(CPack):
cmake
复制
# CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(MyQtApp VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Widgets REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} Qt5::Widgets)

# 安装规则
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)

# CPack 配置
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_VENDOR "YourCompany")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "My Qt Application")

if(WIN32)
    set(CPACK_GENERATOR "NSIS")
    set(CPACK_NSIS_DISPLAY_NAME ${PROJECT_NAME})
elseif(APPLE)
    set(CPACK_GENERATOR "DragNDrop")
elseif(UNIX)
    set(CPACK_GENERATOR "DEB;RPM")
endif()

include(CPack)
构建安装包:
bash
复制
cmake -B build -S .
cmake --build build --config Release
cpack -C Release --config build/CPackConfig.cmake
5.2 CI/CD 自动化(GitHub Actions)
yaml
复制
# .github/workflows/build.yml
name: Build Installers

on: [push, pull_request]

jobs:
  build-windows:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Qt
        uses: jurplel/install-qt-action@v3
        with:
          version: '5.15.2'
          
      - name: Build
        run: |
          qmake CONFIG+=release
          nmake
          
      - name: Deploy
        run: |
          windeployqt release\YourApp.exe
          # 使用 NSIS 或 Qt Installer Framework 制作安装包
          
      - name: Upload
        uses: actions/upload-artifact@v3
        with:
          name: windows-installer
          path: YourApp-Setup.exe

  build-linux:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Qt
        uses: jurplel/install-qt-action@v3
        
      - name: Build AppImage
        run: |
          # 编译...
          # 使用 linuxdeployqt 制作 AppImage
          
      - name: Upload
        uses: actions/upload-artifact@v3
        with:
          name: linux-appimage
          path: YourApp-x86_64.AppImage

  build-macos:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Qt
        uses: jurplel/install-qt-action@v3
        
      - name: Build
        run: |
          qmake CONFIG+=release
          make
          macdeployqt YourApp.app -dmg
          
      - name: Upload
        uses: actions/upload-artifact@v3
        with:
          name: macos-dmg
          path: YourApp.dmg
六、常见问题与解决方案
6.1 运行提示缺少 Qt 库?
原因: windeployqt/macdeployqt 未正确运行,或插件目录缺失。
解决:
bash
复制
# Windows:检查 platforms 目录是否存在 qwindows.dll
# Linux:设置 LD_LIBRARY_PATH 或使用 rpath
patchelf --set-rpath '$ORIGIN/lib' YourApp

# macOS:检查 Frameworks 目录
otool -L YourApp.app/Contents/MacOS/YourApp
6.2 图标/图片无法显示?
原因: 图像格式插件未打包。
解决:
bash
复制
# 确保 imageformats 目录包含 qjpeg.dll, qpng.dll 等
windeployqt YourApp.exe --dir dist
# 手动复制:Qt/plugins/imageformats/* -> dist/imageformats/
6.3 中文显示乱码?
原因: 缺少翻译文件或字体。
解决:
cpp
复制
// main.cpp 中添加
#include <QTranslator>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    
    // 加载 Qt 自带中文翻译
    QTranslator translator;
    translator.load(":/translations/qt_zh_CN.qm");
    app.installTranslator(&translator);
    
    // 或使用系统字体
    app.setFont(QFont("Microsoft YaHei", 9));
}
6.4 数据库驱动加载失败?
原因: SQL 驱动插件未打包。
解决:
bash
复制
# 复制 sqldrivers 目录
# Windows: Qt/plugins/sqldrivers/qsqlite.dll, qsqlmysql.dll
# Linux: Qt/plugins/sqldrivers/libqsqlite.so
七、最佳实践总结
表格
平台    推荐方案    输出格式
Windows    windeployqt + NSIS/Qt Installer Framework    .exe 安装包
Linux    linuxdeployqt (AppImage)    .AppImage
macOS    macdeployqt + create-dmg    .dmg 镜像
打包检查清单:
[ ] Release 模式构建
[ ] 所有依赖 DLL/SO/Dylib 已包含
[ ] 插件目录(platforms, imageformats, sqldrivers)完整
[ ] 翻译文件(如需要)已添加
[ ] 图标/资源文件正确嵌入
[ ] 在干净环境(无 Qt 环境)测试通过
[ ] 安装/卸载流程测试正常
参考资料:
Qt 官方部署文档:https://doc.qt.io/qt-6/deployment.html
Qt Installer Framework 手册:https://doc.qt.io/qtinstallerframework/
NSIS 文档:https://nsis.sourceforge.io/Docs/

更多推荐