Qt在统信UOS及银河麒麟Kylin系统中进行软件开发的环境配置,打包发布和注意事项

前述

之前由于项目产品需要,要将原本在Windows上的产品移植到信创环境,也就是现在的主流国产操作系统 统信UOS及银河麒麟Kylin。
先大概讲下信创系统:
信创系统就像是中国自己打造的 “数字基建”,目的是让咱们国家的信息技术不再依赖国外,实现自主可控。简单来说,就是从电脑、手机到服务器,从操作系统、软件到芯片,全部用国产技术搭建,避免被 “卡脖子”,保障数据安全。比如政府、银行、医院这些关键部门,现在都在逐步换成信创系统,就像给信息安全上了一道 “防盗门”。
那主流的两个国产操作系统统信UOS及银河麒麟Kylin,他们都属于信创,他们的出现其实跟华为的鸿蒙系统产生的背景因素也差不多。
这两个操作系统的产品大概有两大类,也就是用于服务器的操作系统作为一大类,类似CentOS,或者Windows Server;还有就是用于个人用户的桌面版的操作系统,类似Windows10,Windows11等。
回到主题,本篇文章主要说明在统信UOS及银河麒麟Kylin这两个系统的个人PC版上Qt开发,以Qt5+统信UOS为例,解释如何在统信UOS上进行Qt软件开发,及其环境的配置,以及有哪些要注意的事项。

一.环境搭建

1.1.操作系统的选择和安装;

首先,你要获取统信 UOS 开发版系统,可以访问统信软件官网下载最新的统信 UOS 桌面开发版镜像。然后在你的虚拟机或实体机上进行系统安装(虚拟机搭建机系统安装不作为本次重点,这里就一笔带过);

1.2.开发环境的搭建;

目标操作系统搭建好之后,接下来就要搭建开发环境。根据你的需要,一路命令往下走:

1.2.1 安装gcc

使用命令"sudo apt update",然后"sudo apt install gcc",安装好gcc;

1.2.2 安装g++

使用命令"sudo apt update",然后"sudo apt install g++",安装好g++;

1.2.3 解压依赖包

如果有用到,根据自己的需要来:

  • 运行tar -zxvf 包名,解压一些常用的依赖包,比如:boost包,OpenSSL包,curl包;
  • 进入boost包,执行./bootstrap.sh编译,然后执行sudo ./b2 install安装;
  • 进入OpenSSL包,执行./config,然后make,然后sudo make install;
  • 进入curl包,执行./configure,(mips处理器下用./Configure linux64-mips64 no-asm生成makefile)然后执行make,然后sudo make install;
1.2.4 安装Qt
  • 在系统的应用商店安装Qt,这里为什么一定要在系统的商店去安装,因为目前UOS商店里的Qt安装包是他们系统商自己二次开发并进行测试无误后上架的,基本上在UOS系统上使用没什么问题的。个人不建议自己通过Qt源码进行交叉编译安装,因为UOS系统界面也是他们用Qt作为开发工具做的,如果自己编译Qt,很容易跟系统商用Qt做的一些系统用的依赖库产生冲突(我自己就踩过坑)。
  • 如果使用商店里装的Qt打开后不能配置项目,这时候就要查看以下Qt的kits配置项中的Qt versions,手动配置Qt版本(一般在usr/bin/qmake),如果无法配置,则用命令“qmake -v”检测下qmake,如果qmake没有安装好的话,使用命令sudo apt install qt5-default重新安装qt;,如果安装提示还有依赖没安装,则先安装依赖的包,安装也可以用命令“sudo aptitude install qt5-default”来安装,如果没有安装qtcreator使用命令“sudo apt install -f qtcreator“来安装。
  • 安装qtwebsocket包(如果有用到这些基本库之外的模块),解压qtwebsocket包,执行qmake生成makefile文件,执行make,如果报错“qobject_p.h”有问题,执行sudo apt install qtbase5-private-dev,安装qt的一个基础库,然后再重新执行make,make成功后,执行sudo make install安装qtwebsocket包;建议优先使用系统自带的qtwebsocket包安装,使用命令sudo apt-get install libqt5websockets5-dev;
1.2.5 安装Cmake
  • 执行"sudo apt install cmake" 先安装cmake;
  • 然后执行sudo apt install cmake-qt-gui安装Cmake执行器;
  • 然后执行cmake-gui,打开cmake,设置BrowseSource和BrowseBuild的源码路径,及创建路径。注意:如果是麒麟系统,直接pwd取的路径直接填,如果是uos,要去掉前面的/data;

这样基本上Qt本身的开发环境就搭建好了。
接下来就是编译你移植过来的程序代码

二.编译程序

2.1 直接使用gcc编译的

对于有makefile文件,直接使用make命令启动gcc编译;

2.2 使用cmake编译的

  • 执行cmake-gui,打开cmake,设置BrowseSource和BrowseBuild的源码路径及创建路径,这里像前文说的注意麒麟系统上直接pwd取的路径直接填,uos上要去掉前面的/data,先点击“Configure”,初步编译后,修改CMAKE_INSTALL_PREFIX为…/libs,点击“Configure”来生成makefile;
  • 缺少库依赖,前面使用cmake编译时,如果出现缺少依赖库的报错情况,则需要根据报错提示,缺少什么库,就安装什么库;
  • 依赖库安装成功后,点击Generate按钮在build下生成Makefile,在Makefile中执行make命令来编译程序;

2.3 使用Qt编译的

如果是Qt开发的程序,需要时qmake编译,那就直接打开Qt,在Qt的构建套件中,选择合适的Qt版本编译器来编译输出。

三.打包输出

统信UOS和银河麒麟Kylin都要求输出deb包,就是打包格式是“.deb”。

3.1 文件拷贝

首先创建一个目录,安装打包输出的目录,将主程序,依赖库,配置文件等都放入到相应位置。
目录设定如下:
注:图中所有带框的指文件夹,所有纯字条的指文件
注:图中所有带框的指文件夹,所有纯字条的指文件。

这个目录框架基本是固定的。
包名:com.你的公司名.你的产品名,就像这样“com.mycompanyname.myproduct”;
安装目录:/opt/apps/
控制类文件:control,postinst,postrm,preinst。
桌面链接:.desktop文件,也就是类似Windows的桌面快捷方式;
桌面图标:必须放在…/entries/icons/hicolor下;
info文件:产品包的说明型文件;

3.2 控制文件

四个控制文件,这个很重要,是如果操作包解压安装以及卸载的流程关键。
control文件写法举例:

Package: com.mycompanyname.myproduct
Name: myproduct
Version: 1.0.1.2
Section: utils
Priority: optional
Architecture: mips64el
Installed-Size: 20
Maintainer: szca
Description: 深圳xxx公司最牛逼的信息产品UOS包

postinst文件写法举例:

echo "开始执行配置脚本"
theuser=$(users | awk '{print $1;}')
if [ ! -d "/home/$theuser/桌面" ]; then
   des="/home/$theuser/Desktop"
else
   des="/home/$theuser/桌面"
fi
echo "驱动桌面快捷方式"
cp /opt/apps/com.mycompanyname.myproduct/entries/applications/xxxx_Monitor.desktop "$des"
chmod a+x "$des/xxxx_Monitor.desktop"
chown $theuser "$des/xxxx_Monitor.desktop"

echo "创建客户端桌面快捷方式"
cp /opt/apps/com.mycompanyname.myproduct/entries/applications/xxxx_Tool.desktop "$des"
chmod a+x "$des/xxxx_Tool.desktop"
chown $theuser "$des/xxxx_Tool.desktop"

echo "配置本地服务自启动"
chmod a+x /opt/apps/com.mycompanyname.myproduct/entries/applications/xxx_watcher.desktop
sudo cp /opt/apps/com.mycompanyname.myproduct/entries/applications/xxx_watcher.desktop /etc/xdg/autostart/

echo "配置本地服务安装开启"
bash /opt/apps/com.szca.signproducttool/files/xxxx_watcherRun.sh
sudo ldconfig

echo "配置结束"

postrm文件写法举例:

sudo update-rc.d -f xxxx_watcher remove
sudo rm /etc/xdg/autostart/xxxx_watcher .desktop
if [ "$1" = 0 ]; then
  theuser=$(users | awk '{print $1;}')
  rm -rf /home/*/.config/xxxx_Monitor
  rm -rf /home/*/.config/xxxx_Tool
  echo "移除缓存数据"
  if [ ! -d "/home/$theuser/桌面" ]; then
     des="/home/$theuser/Desktop"
  else
     des="/home/$theuser/桌面"
  fi
  rm "$des/xxxx_Monitor.desktop"
  echo "移除驱动的桌面快捷方式"
  rm "$des/xxxx_Tool.desktop"
  echo "移除客户端的桌面快捷方式"
fi

preinst文件写法举例:

echo "安装前执行脚本"
PIDS=`ps -ef |grep xxxx_Monitor |grep -v grep | awk '{print $2}'`
PIDS=`ps -ef |grep xxxx_Tool |grep -v grep | awk '{print $2}'`

3.3 包信息说明

包信息的说明文件就是包里边的info文件,info文件的内容如下:
包括包的ID(也就是名称),产品名称,适配的处理器,注意:这里是个重点要关注的地方,不同的处理器都要重新编译适配打包的,比如x86,arm,mips,都得各自走一遍编译适配。

{
    "appid":"com.mycompanyname.myproduct",
    "name":"myproduct",
    "version":"1.0.1.2",
    "arch": ["mips64el"],
    "permissions": {
        "autostart": false,
        "notification": false,
        "trayicon": false,
        "clipboard": false,
        "account": false,
        "bluetooth": false,
        "camera": false,
        "audio_record": false,
        "installed_apps": false
    },
    "support-plugins": [
        "plugin/demo"
    ],
    "plugins": [
        "plugin/webbrowser",
        "plugin/office"
    ]
}

3.5 桌面链接

也就是桌面快捷方式,写法如下:

[Desktop Entry]
Categories=Application
Comment="released_on_2023_09_24"
Encoding=UTF-8
Exec=sh /opt/apps/com.mycompanyname.myproduct/files/xxxx_MonitorRun.sh
Icon=/opt/apps/com.mycompanyname.myproduct/entries/icons/hicolor/128x128/apps/SZCAMonitor.png
Name=SZCAMonitor
Name[zh_CN]=驱动助手
Terminal=false
Type=Application
X-Deepin-Vendor=user-custom

3.6 其他说明

对于一些要启动的程序,建议去创建脚本,使用脚本启动程序运行,这样可以在脚本中添加环境变量,以及一些依赖库的配置等,你可以把启动脚本看作程序的启动入口,比如桌面链接启动程序时,就可以调用启动脚本来拉起程序;例如设置某个工具的启动脚本:

#!/bin/sh

#环境变量
cd /opt/apps/com.mycompanyname.myproduct/files/
#export PATH="/opt/apps/com.mycompanyname.myproduct/files/:$PATH"
export LD_LIBRARY_PATH="/opt/apps/com.mycompanyname.myproduct/files/lib/:$LD_LIBRARY_PATH"
apps_path=/opt/apps/com.mycompanyname.myproduct/files/xxxx_Tool

pgrep xxxx_Tool
if [ $? -eq 0 ];then
	pkill -9 xxxx_Tool
fi

if [ -f ${apps_path} ];then
echo "xxxx_Toolrun..."
${apps_path}&
else
echo "xxxx_Tool not found..."
fi

3.7 打包输出

前面文件配置好后,再打包就很简单,在包文件夹外执行命令“sudo dpkg -r com.mycompanyname.myproduct”即可,就会输出.deb包发给UOS进行检验,以供后续申请上架。

四.其他环境

如果是银河麒麟系统,有一点注意事项:

  • 银河麒麟系统如果需要做桌面链接(桌面快捷方式),需要将前文“entries”目录下的所有文件转到跟“opt”平级的“usr”目录下,并且支持".svg"图片格式,他的目录结构是这样的:
    注:图中所有带框的指文件夹,所有纯字条的指文件
    注:图中所有带框的指文件夹,所有纯字条的指文件。
  • 银河麒麟下,对于一些主程序的依赖库,需要额外配置,可以使用脚本,在打包后先安装,然后执行脚本,或者将该脚本放入到启动脚本中:
#!/bin/bash
cd /opt/apps/com.mycompanyname.myproduct/files
patchelf --set-rpath /opt/apps/com.mycompanyname.myproduct/files/lib xxxx_Tool
patchelf --set-rpath /opt/apps/com.mycompanyname.myproduct/files/lib xxxx_Monitor

cd /opt/apps/com.mycompanyname.myproduct/files/lib
patchelf --set-rpath /opt/apps/com.szca.signproducttool/files/lib libzzzz.so.1
patchelf --set-rpath /opt/apps/com.szca.signproducttool/files/lib libyyyy.so
patchelf --set-rpath /opt/apps/com.szca.signproducttool/files/lib libxxxx.so

  • 银河麒麟要求将依赖库必须放到lib文件夹中;
  • 银河麒麟要求包名必须要全部小写,不能出现大写字母;
  • 另外要注意,在前期开发时,尽量避免使用系统库的东西,能用Qt库或者C++标准库的绝不用系统库,不然移植到Linux环境,没有依赖库很麻烦。

以上即之前对接适配信创系统进行移植编译开发的一些记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牵牛老人

码字不易,您的支持就是动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值