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博客

1473

被折叠的 条评论
为什么被折叠?



