Linux下Qt打包发布

一、使用linuxdeployqt拷贝依赖文件

1. 下载linuxdeployqt

GitHub Releases 下载:

1
2
3
4
5
6
7
8
# 重命名简化
mv linuxdeployqt-6-x86_64.AppImage linuxdeployqt
# 添加执行权限
chmod 777 linuxdeployqt
# 移至系统路径
mv linuxdeployqt /usr/local/bin
# 验证安装
linuxdeployqt --version

2. 配置Qt环境变量

编辑 ~/.bashrc,添加Qt路径(根据实际安装路径调整):

1
2
3
4
5
#add qt env
export PATH=/opt/Qt5.13.0/5.13.0/gcc_64/bin:$PATH
export LIB_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/plugins:$PLUGIN_PATH
export QML2_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/qml:$QML2_PATH

使配置生效:

1
2
3
source ~/.bashrc
# 验证
qmake -v

注意:最关键的是 PATH 环境变量,其他变量可能非必需。

3. 拷贝依赖文件

准备目录结构:

1
2
mkdir -p TestSetup/Test
cp YourApp TestSetup/Test/ # 替换为你的应用

执行依赖拷贝:

1
2
cd TestSetup/Test
linuxdeployqt Test -appimage

重要提示

  • 确保应用为 Release 版本
  • linuxdeployqt 内部使用 ldd,仅能处理隐式加载.so 文件
  • 对于显式加载.so(如 dlopen),需手动处理其依赖:
    1
    2
    3
    # 示例:若 A.so 显式加载 B.so,而 B.so 隐式依赖 C.so
    # 需对 B.so 单独执行:
    linuxdeployqt B.so -appimage

4. 验证应用运行

清除Qt环境变量后测试:

1
2
3
4
5
6
7
# 清除环境变量(仅当前终端)
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export LIB_PATH=
export PLUGIN_PATH=
export QML2_PATH=
# 运行应用
./Test

二、打包为.deb安装包

1. 目录结构规划

1
2
3
4
5
6
7
8
TestSetup/
├── output/ # 存放生成的.deb包
└── source/ # 打包源文件
├── DEBIAN/ # 控制文件目录(固定名称)
└── opt/Test/ # 安装目标路径(对应系统/opt/Test/)
├── Test # 应用程序
├── lib/ # 依赖库
└── ... # 其他资源

创建目录:

1
2
3
mkdir -p TestSetup/{output,source/{DEBIAN,opt/Test}}
# 移动依赖文件
mv TestSetup/Test/* TestSetup/source/opt/Test/

2. 配置桌面快捷方式

编辑 TestSetup/source/opt/Test/Test.desktop

1
2
3
4
5
6
7
[Desktop Entry]
Type=Application
Name=My Test # 应用显示名称
Exec=/opt/Test/Test # 绝对执行路径
Icon=/opt/Test/Test.png # 绝对图标路径
Comment=This is my test # 描述信息
Terminal=false # 是否启动终端(false=仅应用窗口)

注意

  • 路径必须是安装后的绝对路径(非打包路径)
  • 需赋予执行权限:chmod +x Test.desktop
  • 准备图标文件:Test.png

3. 创建DEBIAN控制文件

control(包元数据)

TestSetup/source/DEBIAN/control

1
2
3
4
5
6
7
8
9
Package: mytest                 # 包名(卸载时使用)
Version: 0.1.0
Section: utils
Priority: optional
Architecture: amd64
Depends: # 依赖包(留空或填写)
Installed-Size: 512
Maintainer: 123@163.com
Description: my test package

postinst(安装后脚本)

TestSetup/source/DEBIAN/postinst

1
2
3
4
#!/bin/sh
chmod 777 /opt/Test/Test.desktop
cp /opt/Test/Test.desktop /usr/share/applications/ # 开始菜单
cp /opt/Test/Test.desktop ~/Desktop/ # 桌面快捷方式

postrm(卸载后脚本)

TestSetup/source/DEBIAN/postrm

1
2
3
4
5
#!/bin/sh
rm -f /usr/share/applications/Test.desktop
rm -f ~/Desktop/Test.desktop
# 若需删除应用生成的日志,添加:
# rm -rf ~/.config/YourApp/ # 根据实际日志路径调整

脚本要求

  • 首行必须为 #!/bin/sh
  • 赋予执行权限:chmod +x DEBIAN/{postinst,postrm}

4. 构建.deb包

1
2
cd TestSetup/source
dpkg -b . ../output/test_amd64_0.1.0.deb

三、安装与卸载

1. 安装

1
2
cd TestSetup/output
sudo dpkg -i test_amd64_0.1.0.deb

验证效果

  • 桌面出现快捷方式
  • 开始菜单 → Other 中出现应用
  • 应用文件位于 /opt/Test/

2. 卸载

1
2
# 使用control文件中的Package字段值
sudo apt-get remove mytest

卸载效果

  • 删除 /opt/Test/ 目录
  • 自动移除桌面和开始菜单快捷方式
  • (若在 postrm 中配置)删除应用日志

关键注意事项

  1. 依赖完整性:显式加载的 .so 需单独处理依赖
  2. 路径一致性.desktop 文件中的路径必须匹配安装路径
  3. 脚本权限DEBIAN 目录下的脚本必须有执行权限
  4. 包名唯一性control 中的 Package 字段需全局唯一

相关笔记与链接建议

  • 当前笔记引用:Linux下Qt打包发布
  • 建议补充双向链接:
    • [[Qt应用部署最佳实践]] - 跨平台部署策略
    • [[Linux软件包管理]] - deb/rpm 包机制对比
    • [[CMake构建系统]] - Qt项目自动化构建
    • [[AppImage打包指南]] - 替代打包方案

总结

通过 linuxdeployqt + dpkg 组合,可高效生成符合 Linux 发行版规范的安装包,实现依赖自动管理、快捷方式集成和干净卸载。