Qt在统信UOS及银河麒麟Kylin系统中进行软件开发的环境配置,打包发布和注意事项
前述
之前由于项目的产品需要,必须将原本Windows上的产品移植到信创环境,也就是现在的主流国产操作系统统信UOS及银河麒麟Kylin。
先大概讲下信创系统:
信创系统就像是中国自己打造的 “数字基建”,目的是让咱们国家的信息技术不再依赖国外,实现自主可控。简单来说,就是从电脑、手机到服务器,从操作系统、软件到芯片,全部用国产技术搭建,避免被 “卡脖子”,保障数据安全。比如政府、银行、医院这些关键部门,现在都在逐步换成信创系统,就像给信息安全上了一道 “防盗门”。
那么针对主流的两个国产操作系统统信UOS及银河麒麟Kylin,他们都属于信创,其实跟华为的鸿蒙产生的背景一样。
这两个操作系统的产品大概有两大类,既有用于服务器的操作系统,类似CentOS,或者Windows Server;也有用于个人用户电脑的操作系统,类似Windows10,Windows11等。
本篇文章主要说明在统信UOS及银河麒麟Kylin这两个系统的个人PC版上的使用。
回到主题,本篇就以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/桌面" ]; thendes="/home/$theuser/Desktop"
elsedes="/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 ldconfigecho "配置结束"
postrm文件写法举例:
sudo update-rc.d -f xxxx_watcher remove
sudo rm /etc/xdg/autostart/xxxx_watcher .desktop
if [ "$1" = 0 ]; thentheuser=$(users | awk '{print $1;}')rm -rf /home/*/.config/xxxx_Monitorrm -rf /home/*/.config/xxxx_Toolecho "移除缓存数据"if [ ! -d "/home/$theuser/桌面" ]; thendes="/home/$theuser/Desktop"elsedes="/home/$theuser/桌面"firm "$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_Toolpgrep xxxx_Tool
if [ $? -eq 0 ];thenpkill -9 xxxx_Tool
fiif [ -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_Monitorcd /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环境,没有依赖库很麻烦。
以上即之前对接适配信创系统进行移植编译开发的一些记录。