Qt打包

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软件进行打包
2. Linux平台
2.1 linuxdeployqt下载安装
下载地址:https://github.com/probonopd/linuxdeployqt/releases
1 | mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt |
2.2 Qt环境变量配置
工具会根据生成的可执行文件,自动搜索依赖,
所以我们需要确保Qt库的相关路径设置到环境变量中,这样工具在搜索时才能找到,并拷贝它们。
1 | vim ~/.bashrc |
1 | export PATH=/opt/Qt/5.15.2/gcc_64/bin:$PATH |
1 | #让文件立即生效 |
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 | # $ORIGIN 是一个特殊的占位符,它代表可执行文件自身所在的目录 |
2.4 打包
2.4.1 使用linuxdeployqt加载全部依赖
1 | linuxdeployqt video_system -appimage |
可执行程序不能放在bin路径下,否则会将打包的文件会放在bin文件夹外
打包完成后要先验证将整个目录拷贝到目标电脑上是否可以运行
2.4.2 使用dpkg打包安装程序
目录结构:
graph LR A[PACKAGE_LINUX] --> B[output/video-alarm_1.0.0_amd64.deb] A[PACKAGE_LINUX] --> C[video-alarm] C[video-alarm] --> D[usr/share] D --> E[applications/video_system.desktop] D --> F[video-alarm/jydimage.ico] C[video-alarm] --> G[opt/video-alarm/video_system] C[video-alarm] --> H[DEBIAN/control] A[PACKAGE_LINUX] --> I[create_deb.sh] A[PACKAGE_LINUX] --> J[uninstall_deb.sh]
1 | PACKAGE_LINUX/ # 打包根目录 |
control文件示例
1 | Package: video-alarm |
video_system.desktop 文件示例
1 | [Desktop Entry] |
create_deb.sh 文件示例
1 | !/bin/bash |
uninstall_deb.sh 文件示例
1 | !/bin/bash |
可能遇到的错误:
1 | wyw@Deepin:~/Desktop/packet$ ./create_deb.sh |
1 | wyw@Deepin:~/Desktop/packet$ ./create_deb.sh |