linux下Qt打包程序(Ubuntu18.04)

0. 环境

ubuntu 18.04 (20.04同样方法也可以)

qt 5.12.11

1. release project

用qt打开项目后,生成项目的release版本(比Debug版本占用体积更小,运行速度更快),可以指定一个release文件夹进行编译。

2. 可执行文件单独拷贝

新建一个文件夹xxx,将上一步release生成的可执行程序移动到文件夹xxx中。

第1步release文件夹中会编译出一个不带后缀的二进制文件(文件名是程序指定的名称),为可执行程序。将此程序复制到新建的xxx文件夹中。

3 在新建的文件夹中建立两个脚本文件

cd xxx    # xxx为上一步新建的文件夹
touch copy_lib.sh    # 建立第一个shell文件
touch your_project_name.sh    # 建立第二个shell文件,注意第二个脚本文件的名字必须与可执行文件的命名相同

新建完成后,分别编辑两个脚本

3.1 脚本copy_lib.sh

#!/bin/sh
exe="your_project_name"  # 需要发布的程序名称
pwd="your_project_file_path"  # 所建文件夹的路径
files=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $files $pwd

3.2 脚本your_project_name.sh

这个只需要注意文件名,里面的内容基本不变。(如果想把调用的库不全部放在根目录下面,放在一个文件夹里,如libs文件夹下,需要修改注释“将当前目录(库所在目录)加入环境变量”下面的代码,把所有库的路径改一下)

#!/bin/sh

# 获取应用名称(如应用名称为app,那么脚本为app.sh
appname=`basename $0 | sed s,\.sh$,,`

# 获取应用当前目录
dirname=`dirname $0`
tmp="${dirname#?}"

# 判断目录是不是根目录
if [ "${dirname%$tmp}" != "/" ]; 
then
dirname=$PWD/$dirname
fi

# 将当前目录(库所在目录)加入环境变量
LD_LIBRARY_PATH=$dirname/lib
export LD_LIBRARY_PATH

# 运行
$dirname/$appname "$@"

4 执行脚本文件

给两个脚本文件赋予权限并执行。

sudo chmod 777 copy_lib.sh    #赋予权限
sudo chmod 777 your_project_name.sh    #赋予权限

./copy_lib.sh    #执行第一个脚本文件,此时xxx文件夹中会多些so库文件
./your_project_name.sh    #执行第二个脚本文件,即可运行程序

5 QT界面等需要额外的库

使用QT中的界面等库的时候,如果迁移到别的ubuntu环境运行,执行脚本命令 ./your_project_name.sh 的时候,经常会报错

could not find the QT platform plugin "xcb" in .....

将QT中的 platforms 文件夹 整个都放置到和 可执行文件同一级的地方
如QT可执行文件为 your_project_name ,是放在xxx文件夹下的,那就将整个platforms文件都放置到xxx文件夹里面,和your_project_name同一级。

事实上,就ubuntu移植,只需要libqxcb.so 动态库即可,可以把platforms文件夹删的只剩一个libqxcb.so,但必须保留整个文件夹。

platforms路径】正常安装情况下,以我自己用的版本为例,在Qt5.12.11/5.12.11/gcc_64/plugins/ 文件夹下可以找到platforms文件夹。

该动态库libqxcb.so也会调用其他库,可以使用步骤3中的copy_lib.sh,将其中的your_project_name改为libqxcb.so,然后同样运行一下,可以将libqxcb.so的依赖库复制出来。把这些库和之前的项目复制出来的库都统一放到一个位置(比如直接都放置在xxx文件夹下)

6  libqxcb.so需要的额外文件

上述1-5步骤完成后,仍然会报错。

QXcbIntegration:无法创建平台OpenGL上下文,GLX和EGL都不启用
// 或者是英文同样意思的错误

此时,还需要将Qt5.12.11/5.12.11/gcc_64/plugins/ 下面的xcbglintegrations文件夹也复制到和platforms同级文件夹下。

这时候我们的xxx文件夹下面,需要有

1. platforms 文件夹

2. xcbglintegrations 文件夹

3. your_project_name 可执行程序

4. your_project_name.sh 脚本文件

5. 许多依赖库so等文件(最好放在一个文件夹内,如新建一个 libs 文件夹存放)

还有之前复制库的脚本,但是运行程序时不需要

7 命令行运行程序

./your_project_name.sh    #执行脚本文件,即可运行程序

8 openvino等推理库

如果用到了openvino等推理库,会存在调用库收集不全的情况。比如读取ir格式数据的时候,报错plugins.xml找不到、Error loading xmlfile 等错误。

需要将相关库文件拷贝进上面说的依赖库文件夹。都在路径/opt/intel/openvino/inference_engine/lib/intel64/ 里面

1. /opt/intel/openvino/inference_engine/lib/intel64/plugins.xml

2. 打开plugins.xml,可以看到多个平台的推理动态库,将需要用到的拷贝到依赖库文件夹,如CPU推理需要libMKLDNNPlugin.so, GPU推理需要libclDNNPlugin.so

3. 模型读取需要的动态库,libinference_engine_ir_reader.so 和libinference_engine_lp_transformations.so 也需要。

参考:

https://blog.csdn.net/u013736136/article/details/80404538

Ubuntu移植QT程序,出现could not find the QT platform plugin “xcb“ in “ 时的一种解决方案_daycqr的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值