麒麟系统开发笔记(八):在国产麒麟系统上使用linuxdeployqt发布qt程序

前言

  在 ubuntu 上发布 qt 程序相对还好,使用脚本,但是在麒麟上发布的时候,因为银河麒麟等不同版本,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用 linuxdeployqt 发布 qt 程序。

 

补充

  在 ubuntu 上发布程序遇到 xcb 问题,当我们将其部署到另外同样环境但是未装 qt 的环境下,运行起来一部分是 xcb 文件,有一部分解决后可以正常运行启用,另一部分直接段错误,程序宕掉(提示,段核心错误,已转存什么的),使用 linuxdeployqt 能解决此问题,也就是使用脚本打包的升级版本。

 

linuxdeployqt

  Linux 部署工具 linuxdeployqt 将应用程序作为输入,并通过将应用程序使用的资源(如库、图形和插件)复制到一个包中使其自包含。结果包可以作为 AppDir 或 AppImage 分发给用户,也可以放入交叉分发包中。它可以作为构建过程的一部分,在 CMake、qmake 和 make 等系统中部署用 C、C++ 和其他编译语言编写的应用程序。当用于基于 Qt 的应用程序时,它可以绑定运行应用程序所需的 Qt 的特定最小子集。

源码下载地址

 

linuxdeployqt 编译(麒麟系统,ubuntu)

步骤一:下载解压

  在这里插入图片描述

步骤二:修改源码,去掉版本检查

  找到 main.cpp 源码,将这一段(在 192 行左右)注释掉:

gedit tools/linuxdeployqt/main.cpp

  在这里插入图片描述
  (注意:这一步不做会导致打包输出错误信息,具体看“入坑一”)

步骤三:安装依赖第三方库

sudo apt-get install cmake
sudo apt-get install patchelf

步骤四:使用 cmake 配置

cmake CMakeList.txt

  在这里插入图片描述

  因为安装了 git 与这个工程可能不对,我们直接使用源码修改大法,直接定位到代码给删掉:
  在这里插入图片描述
  直接删掉目录下的缓存文件:CMakeCache.txt,然后继续:
  在这里插入图片描述

步骤五:配置 Qt 的依赖环境

  麒麟系统本身自带了 qt5,而我们使用了另外安装的 qt5,所以依赖需要引入我们自己安装的 qt5 上。
  为了方便配置,也不影响系统我们装上 cmake 的 gui 版本:

sudo apt-get install cmake-gui

  在这里插入图片描述

cmake-gui 

  选择对应的路径,然后使用默认 unix makefile 方式配置:
  在这里插入图片描述
  错误如下:
  在这里插入图片描述
  添加环境变量路径:
  在这里插入图片描述
  继续配置成功:
  在这里插入图片描述

步骤六:生成 generate

  在这里插入图片描述

步骤七:编译 make

  切入 build 目录,并且使用 make 命令即可:

make

  在这里插入图片描述

步骤八:安装到系统目录

  没有 make install 这个,手动移动到 /usr/local/bin

sudo mv linuxdeployqt /usr/local/bin/

  在这里插入图片描述

步骤九:测试是否编译成功

  在这里插入图片描述

 

linuxdeployqt 打包流程

  新建一个工程
  在这里插入图片描述
  然后找个空目录:
  在这里插入图片描述
  开始打包:
  在这里插入图片描述
  错误“QDir::exists: Empty or null file name”,需要调整打包命令:
  在这里插入图片描述
  错误“qmake not fount on the PATH”,qmake 要引入PATHqmake要引入 PATH 中:

export PATH=$PATH:/home/hdgx/Qt5.12.1/5.12.1/gcc_64/bin

  这里要将 Qt 引入环境,为了不影响系统,使用脚本引入,每次使用之前使用 source env.sh 引入即可。

#!/bin/sh
QT_DIR=/home/hdgx/Qt5.12.1/5.12.1/gcc_64
export PATH=${QT_DIR}/bin:$PATH
export LIB_PATH=${QT_DIR}/lib:$LIB_PATH
export PLUGIN_PATH=${QT_DIR}/plugins:$PLUGIN_PATH
export QML2_PATH=${QT_DIR}/qml:$QML2_PATH
export LD_LIBRARY_PATH=${QT_DIR}/lib:$LD_LIBRARY_PATH

echo $PATH
echo $LIB_PATH
echo $PLUGIN_PATH
echo $QML2_PATH
echo $LD_LIBRARY_PATH

   在这里插入图片描述
  在这里插入图片描述
  下次打包遵循此流程即可,继续打包:
  在这里插入图片描述
  发现已经打包成功(ERROR:Could not parse verbose level 忽略):
  在这里插入图片描述
  在这里插入图片描述

 

入坑

入坑一:运行报错“ERROR:The host system is tool new.”

问题

  在这里插入图片描述

原因

  源码中做了判断,不是源码编译问题,所以要修改源码。

解决

  找到 main.cpp 源码,将这一段(在第 190 行左右)注释掉:
  在这里插入图片描述

gedit tools/linuxdeployqt/main.cpp

  在这里插入图片描述
  然后重新 make:
  在这里插入图片描述