输入关键词开始搜索

Qt 应用部署 — 跨平台打包

Windows — windeployqt

:: 1. Release 构建
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release

:: 2. 复制 exe 到独立目录
mkdir dist
copy build\myapp.exe dist\

:: 3. 自动部署 Qt 依赖
cd dist
windeployqt myapp.exe

:: 完整命令(带参数)
windeployqt --release --qmldir ..\src\qml myapp.exe

windeployqt 做了什么

myapp.exe
  ├── Qt6Core.dll
  ├── Qt6Widgets.dll
  ├── Qt6Sql.dll
  ├── platforms/
  │   └── qwindows.dll
  ├── styles/
  │   └── qwindowsvistastyle.dll
  ├── sqldrivers/
  │   └── qsqlite.dll
  └── imageformats/
      ├── qjpeg.dll
      └── qpng.dll

常见问题

:: 问题 1: 缺少 MSVC 运行时
:: 解决:静态链接 /MT(CMake: set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded"))
:: 或:把 vcredist 一起分发

:: 问题 2: 缺少 OpenSSL DLL
:: windeployqt 不检测 OpenSSL → 手动复制 libcrypto-3-x64.dll libssl-3-x64.dll

:: 问题 3: 程序不报错但闪退
:: 设置环境变量查看详细输出
set QT_DEBUG_PLUGINS=1
myapp.exe 2> debug.log

:: 制作安装包(Inno Setup 示例)
:: 下载 Inno Setup → 向导生成 .iss → 编译 → 输出 .exe 安装包

Linux — linuxdeployqt

# 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 dist && cp build/myapp dist/
./linuxdeployqt-continuous-x86_64.AppImage dist/myapp -appimage

# 3. 输出: MyApp-x86_64.AppImage(可直接运行)

手动部署(更精确)

# 查看依赖
ldd dist/myapp | grep Qt

# 复制依赖
export QT_DIR=/usr/lib/x86_64-linux-gnu/qt6
cp $QT_DIR/lib/libQt6Core.so.6 dist/lib/
cp $QT_DIR/lib/libQt6Widgets.so.6 dist/lib/
cp $QT_DIR/plugins/platforms/libqxcb.so dist/plugins/platforms/

# 设置 rpath(查找路径)
patchelf --set-rpath '$ORIGIN/lib' dist/myapp

# 启动脚本
cat > dist/run.sh << 'EOF'
#!/bin/bash
DIR="$(cd "$(dirname "$0")" && pwd)"
export QT_PLUGIN_PATH="$DIR/plugins"
"$DIR/myapp"
EOF
chmod +x dist/run.sh

macOS — macdeployqt

# 部署 + 签名
macdeployqt MyApp.app -dmg

# 或手动
macdeployqt MyApp.app
# 生成 MyApp.dmg(分发包)

CMake 自动部署

# CMakeLists.txt 末尾
install(TARGETS myapp DESTINATION .)

# CPack 打包
set(CPACK_GENERATOR "ZIP")
set(CPACK_PACKAGE_NAME "MyApp")
set(CPACK_PACKAGE_VERSION "1.0.0")
include(CPack)
cmake --build build
cd build && cpack  # 生成 MyApp-1.0.0.zip

发布前检查清单

☐ Release 模式编译(不开 Debug)
☐ windeployqt / linuxdeployqt 执行过
☐ 程序在干净环境/虚拟机测试过(没有装 Qt 的机器)
☐ OpenSSL DLL 已包含(如果用了 HTTPS)
☐ 数据库驱动已包含(如 qsqlite.dll)
☐ 图片/翻译/配置文件路径正确(相对路径)
☐ 图标 + 版本信息已设置(Windows .rc 文件)
☐ 没有硬编码的绝对路径
☐ 没有依赖 Visual Studio 调试运行时(/MD 而非 /MDd)

# Windows 额外检查
☐ MSVC 运行时已静态链接或附带安装包
☐ 管理员权限是否必要(如不需要,关闭 requestedExecutionLevel)

# Linux 额外检查
☐ AppImage / deb / flatpak 测试通过
☐ libc 版本兼容(在旧系统上测试)

最小化体积

# ① 用 UPX 压缩(慎用,可能被杀软误报)
upx --best myapp.exe  # 5MB → 2MB

# ② 删除不用的 Qt 模块
windeployqt --no-plugins-then --no-translations myapp.exe

# ③ 删除不需要的插件
# 只留 platforms/ + 实际用到的 imageformats/styles