Qt打包

1. Windows平台

1.1 使用windeployqt.exe工具打包

可以为windeployqt.exe添加环境变量

1.1.1 无法定位程序的输入点

原因:windeployqt.exe工具在查询所需库时首先从环境变量中进行寻找,没有使用Qt本身下的路径。

比如:D:\Qt\Qt5.15.2\5.15.2\mingw81_32\plugins\platforms目录下复制qwindows.dll到运行目录下的platforms文件夹下

可以使用everything工具查看

1.2. 打包

使用Inno Setup软件进行打包

image-20250113142153059

image-20250113142552650

image-20250113142711823

image-20250113142915093

image-20250113144633239

image-20250113144802044

image-20250113144905362

image-20250113145131090

image-20250113145200111

image-20250113145240795

image-20250113145403964

image-20250113145447390

image-20250113145537492

image-20250113145834576

image-20250113145924492

image-20250113145951458

2. Linux平台

2.1 linuxdeployqt下载安装

下载地址:https://github.com/probonopd/linuxdeployqt/releases

image-20250317104001405

1
2
3
4
5
6
mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt
chmod 777 linuxdeployqt
sudo mv linuxdeployqt /usr/local/bin

# 测试是否安装成功
linuxdeployqt --version

2.2 Qt环境变量配置

工具会根据生成的可执行文件,自动搜索依赖,
所以我们需要确保Qt库的相关路径设置到环境变量中,这样工具在搜索时才能找到,并拷贝它们。

1
vim ~/.bashrc
1
2
3
4
export PATH=/opt/Qt/5.15.2/gcc_64/bin:$PATH
export LIB_PATH=/opt/Qt/5.15.2/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/opt/Qt/5.15.2/gcc_64/plugins:$PLUGIN_PATH
export QML2_PATH=/opt/Qt/5.15.2/gcc_64/qml:$QML2_PATH

image-20250317104706289

1
2
3
4
#让文件立即生效
source ~/.bashrc
#测试
qmake -v

2.3 安装patchelf(不一定需要)

patchelf 是一个用于修改 ELF(Executable and Linkable Format)格式可执行文件和共享库的工具,主要用于解决 Linux 环境下程序的动态库依赖问题。其核心功能包括:

  • ‌修改动态链接器(Interpreter)‌
    可调整程序使用的动态链接器(如 /lib/ld-linux-x86-64.so.2),使其适配特定版本的 glibc 或其他系统环境‌。
  • ‌设置运行时库搜索路径(RPATH/RUNPATH)‌
    通过设定 RPATH,强制程序在运行时优先从指定路径加载动态库,而非依赖系统默认路径或 LD_LIBRARY_PATH 环境变量‌。
  • ‌修改动态库依赖关系‌
    可添加、删除或替换程序依赖的共享库(如替换旧版本库名为新版本)‌。
  • ‌调整 ELF 文件结构‌
    支持修改页对齐大小、SONAME 等 ELF 头信息,优化文件兼容性‌。

典型应用场景

  • 解决动态库版本冲突‌:当程序依赖特定版本的库文件时,可通过 patchelf 直接绑定自定义路径的库文件‌。
  • ‌程序打包与移植‌:在打包程序时,通过设置 RPATH 使程序独立于系统环境,避免依赖系统路径的库文件‌。
  • ‌跨系统兼容性‌:在旧系统上运行为新系统编译的程序时,可修改动态链接器以适配旧版 glibc‌。
1
sudo apt install patchelf
1
2
3
# $ORIGIN 是一个特殊的占位符,它代表可执行文件自身所在的目录
patchelf --set-rpath '$ORIGIN/lib/' ./video_system # 设置程序动态库链接路径
patchelf --print-rpath ./video_system # 打印链接路径

2.4 打包

2.4.1 使用linuxdeployqt加载全部依赖

1
linuxdeployqt video_system -appimage

可执行程序不能放在bin路径下,否则会将打包的文件会放在bin文件夹外

打包完成后要先验证将整个目录拷贝到目标电脑上是否可以运行

2.4.2 使用dpkg打包安装程序

目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PACKAGE_LINUX/                    # 打包根目录
├── output/
│ └── video-alarm_1.0.0_amd64.deb # 生成的 DEB 包
├── video-alarm/ # DEB 包构建目录(名称自定)
│ ├── DEBIAN/ # 控制文件目录(必须大写)
│ │ └── control # 包元数据文件
│ ├── opt/
│ │ └── video_alarm/ # 程序主安装目录
│ │ └── video_alarm # 可执行程序
│ │ ├── lib/ # 依赖库目录
│ │ └── ... # 其他依赖文件或者配置文件
│ └── usr/
│ └── share/
│ ├── applications/
│ │ └── video_system.desktop # 开始菜单快捷方式
│ └── video-alarm/
│ └── jydimage.png # 标准图标
├── create_deb.sh # 构建脚本
└── uninstall_deb.sh # 卸载脚本

control文件示例

1
2
3
4
5
Package: video-alarm
Version: 1.0.0
Architecture: all
Maintainer: 北京竞业达数字系统科技有限公司
Description: 考场应急呼叫平台

video_system.desktop 文件示例

1
2
3
4
5
6
7
8
[Desktop Entry]
Type=Application
Name=考场应急呼叫平台
Version=1.0
Exec=/opt/video-alarm/video_system
Icon=/usr/share/video-alarm/jydimage.ico
Terminal=false
Categories=Utility;

create_deb.sh 文件示例

1
2
3
#!/bin/bash
sudo dpkg-deb --build video-alarm output/video-alarm_1.0.0_amd64.deb
exit $?

uninstall_deb.sh 文件示例

1
2
3
#!/bin/bash
sudo dpkg --remove video-alarm
exit $?

可能遇到的错误:

1
2
wyw@Deepin:~/Desktop/packet$ ./create_deb.sh 
dpkg-deb: 错误: 软件包的名字含有不是小写字母或 -+ 的字符

image-20250320180019196

1
2
3
4
wyw@Deepin:~/Desktop/packet$ ./create_deb.sh 
dpkg-deb: 错误: control目录的的权限位是 777 (必须 >=0755 且 <=0755)
# 将DEBIAN目录权限设置为755
wyw@Deepin:~/Desktop/packet/video_alarm$ chmod 755 DEBIAN/