打包Qt项目

1 Linux环境

1.1 构建 Release 版本

  • Projects - Add Release - 添加版本名称并确定 - Build

image-20210608094704865

1.2 脚本文件

  • 进入上文构建的 Release 目录
1
vi copylib.sh
  • copylib.sh 内容如下(此处无需修改)
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

LibDir=$PWD"/lib"
Target=$1

lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))

$(mkdir $LibDir)

for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done

1. 3 生成项目的库文件

1
2
chmod 777 copylib.sh
./copylib.sh projectName
  • projectName 为项目名,我的是 Client,根据自己项目自行修改。随即在同目录生成了 lib 文件夹

image-20210608100547153

  • 桌面新建空文件夹,这里命名为 new
  • 将上文中构建的 Release 版本的二进制文件及库文件全部复制到新建的这个 new 中来,(不保留 lib 目录,将其中文件均复制过来)

1. 4 Qt 安装目录的插件中提取 platforms

  • 进入 /opt/Qt5.14.2/5.14.2/gcc_64/plugins/platforms
  • 将 copylib.sh 复制到的platforms
1
sudo ./copylib.sh libqxcb.so
  • 这会生成一个新的 lib 文件夹,将此文件夹所有文件均复制到 new 目录中,删除这个 lib 文件夹
  • 遇到同名文件则跳过,将整个 platforms 复制到 new 目录中
  • 在 new 目录新建与项目同名的脚本,这里是 Client.sh
1
vi projectName.sh
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`

dirname=`dirname $0`
tmp="${dirname#?}"

if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
1
chmod 777 projectName.sh
  • 到这里按说是完成了,但是执行这个 projectName.sh 时,会报错,遇到了xcb的问题,这个问题可以通过 ldd 和 Qt 的调试设置来查明

image-20210608102722541

1. 5 解决 xcb 问题

  • 设置环境变量,以便于看到 Qt 加载的过程,看到详细的报错信息。然后执行上文中的 projectName.sh
1
2
export QT_DEBUG_PLUGINS=1
./projectName.sh
  • 根据标准输出找问题

image-20210608103812082

  • 这里的问题是找不到 libQt5XcbQpa.so.5
  • 可以去 Qt 安装目录的 platforms 目录找(出现 xcb 问题一般是因为以上 platforms 中执行 copylib 的顺序有问题,如果先将 platforms 复制到新目录再执行 copylib 就会缺失一部分库,因此需要在 Qt 安装目录中执行)

1. 6 移植到其他机器的注意事项

  • 打包后,启动程序应该使用 projectName.sh 而不是直接运行 projectName 的二进制文件
  • 执行上述 sh 文件可能会提示权限不够,这时需要给 projectName 二进制文件以及 projectName.sh 脚本 777 权限
1
2
chmod 777 projectName
chmod 777 projectName.sh

1.7 Reference

  1. 打包 https://blog.csdn.net/z3512498/article/details/64922180?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-12.control&dist_request_id=1328603.71798.16152866709520987&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-12.control

  2. xcb https://www.cnblogs.com/ldxn/p/11791810.html

  3. xcb https://blog.csdn.net/sinat_26106275/article/details/82778951

2 Windows环境

2.1 构建 Release 版本

与 Linux 环境同理

2.2 windeployqt 工具拷贝库文件

  • 新建文件夹,将 Release 目录中的 exe 文件拷贝到新文件夹下

  • 命令行工具

image-20210608173440728

  • 在命令行中,进入以上新建的目录,并执行命令 windeployqt Server.exe,其中 Server.exe 为 Release 拷过来的可执行文件

image-20210608173846947

  • 执行完后,文件夹中会多出很多 dll 以及其他一些依赖,Server.exe 也可以正常运行了

2.3 Reference

https://blog.csdn.net/u014453443/article/details/85837138



----------- 本文结束 -----------




0%