本文记录了在飞腾架构麒麟V10桌面系统中打包Qt应用程序及部署的一些注意事项。打包工具使用的是linuxdeployqt,在飞腾架构架构下没有现成的工具安装包,需要自行编译安装。
首先下载linuxqtdeploy下载地址https://github.com/probonopd/linuxdeployqt
下载之后解压目录如上图所示,在编译之前需要修改一个地方,如下图所示红色框中的if(strvercmp(glcv, "2.32") >= 0)
改为if(strvercmp(glcv, "20") >= 0)
,其中glcv的定义为 const char *glcv = gnu_get_libc_version ();
表示libc的版本号, 麒麟V10上自带的glibc版本远大于2.32而小于20,所以这里改为20 就不会报错了。
编译linuxdeployqt需要参考根目录下的BUILDING.md文档,打开该文档,按照提示来编译,下面是需要执行的一些命令:
sudo apt-get -y install git g++ libgl1-mesa-dev
#将qt5的bin目录添加到环境变量
export PATH=/opt/qt5/bin:$PATH
cd linuxdeployqt
qmake
make
不出意外的话,编译很快结束,这时已经生成了linuxqtdeploy 可执行程序,如果想要安装到qt5的bin目录下的话则执行下面的安装命令:
sudo make install
下载源码及编译安装命令如下:
wget https://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.bz2
tar xf patchelf-0.9.tar.bz2
( cd patchelf-0.9/ && ./configure && make && sudo make install )
如果想要生成AppImages,下载系统对应版本的 appimagetool 并添加到系统环境变量$PATH中, 例如安装到/usr/local/bin 目录下,确保下载的文件重命名为 appimagetool
并添加了可执行权限,chmod a+x
。下载及安装命令如下:
sudo wget -c "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" -O /usr/local/bin/appimagetool
sudo chmod a+x /usr/local/bin/appimagetool
至此打包工具安装完成,接下来尝试打包Qt程序。
用linuxdeployqt 打包的过程中,会自动将程序依赖的库文件拷贝到指定目录中去,前提是这些库能被工具访问到。qt程序依赖的库和插件基本上在qt的安装目录下,如果程序还依赖其他的库,如自己编译的动态库、数据库驱动等,都要将其所在的目录添加到环境变量中。下面是一个配置环境变量的示例:
#linuxdeployqt安装在/opt/qt5/bin目录下,确保在终端可以执行该程序
export PATH=/opt/qt5/bin:$PATH
#需要打包的qt程序依赖的库目录,bin目录下有程序依赖的其他so库
export LD_LIBRARY_PATH=/home/demo/bin:$LD_LIBRARY_PATH
#需要打包的qt程序依赖的qt库目录
export LIB_PATH=/opt/qt5/lib:$LIB_PATH
#需要打包的qt程序依赖的qt插件目录
export PLUGIN_PATH=/opt/qt5/plugins:$PLUGIN_PATH
接下来正式打包qt程序。
将编译好的qt应用程序demo拷贝到一个空目录package下。在上面设置好环境变量的终端内切换目录到package下,执行打包命令:
linuxdeployqt demo -appimage
根据程序依赖库的多少,打包时间会有很大差异,打包过程会在package根目录下创建一些目录,结构如下:
如果在打包过程中程序依赖的某个库文件找不到,打包进程将终止并将缺少的库信息输出到终端,根据提示在系统中找到依赖的库拷贝到对应的环境变量所在的目录下后,再次执行打包命令,直到打包完成,不报错。这里有个小技巧,如果缺少的是qt插件,可以尝试在麒麟V10系统自带的qt安装目录下拷贝到你的qt环境中,前提是qt大版本相同。
打包完成后,需要将程序运行所需的一些配置文件、样式表、sqlite数据库文件等拷贝到package目录下。
打包完成后需要测试程序是否能独立运行,重新打开一个终端,在新终端里用命令运行demo程序,看程序能否正常启动,若能正常启动,则说明打包成功,若启动失败则根据错误提示解决问题。
在打包的根目录下会生成名为default.png 和 default.desktop两个文件,其中default.png 就代表应用程序图标,需要替换成你的应用程序图标即可。default.desktop文件的内容如下:
[Desktop Entry]
Type=Application
Name=XXXX系统
Exec=/home/demo/ZODA
Icon=/home/demo/zoda.png
Comment=XXX系统
Terminal=true
这里需要关注的是Exec 和 Icon这两个字段,其中Exec为应用程序所在的绝对路径,Icon为应用程序所在的绝对路径。将default.desktop重命名为应用程序的名字如zoda.desktop,如果Exec和 Icon这两个值设置正确,zoda.desktop文件的图标会变成应用程序图标的样子。修改zoda.desktop的权限,添加可执行权限chmod +x
,然后拷贝到桌面,就可以在桌面双击图标打开应用程序。将 zoda.desktop 拷贝到/usr/share/applications/ 目录下即可在开始菜单中看到你的应用程序的图标。
qt应用程序的任务栏图标要在程序中设置,首先将png格式的图标转为ico格式,并添加在资源文件中,然后在程序的主窗口中设置图标
MainWindow w;
w.setWindowIcon(QIcon(":/zoda.ico"));
重新编译运行程序即可在任务栏中看到应用程序的图标。
以上就是本文的所有内容了,文中的打包部署步骤都是笔者亲自动手实践后的记录,真实有效。如对文中内容有疑问,欢迎留言讨论!!