第一次用QT开发程序并打包发布到任意Linux系统上,期间踩了很多坑,最后目标达成,付出艰辛之后取得的成绩才更可贵啊,现将过程及问题总结一下,希望有相同需求的朋友少走点弯路。
网上有很多Linux下QT打包发布的方法,介绍比较多的是利用打包脚本(pack.sh)进行打包,以文章https://blog.youkuaiyun.com/qq_27350133/article/details/83445258为典型,介绍较为清晰,然而当我用这种方式打包发布后在没有安装qt环境的其他Linux机器上,程序并不能正常运行,还是提示缺少很多依赖库。于是又尝试寻求其它方式进行打包,最后发现借助linuxdeployqt打包发布QT程序简单可行,下面介绍具体步骤。
1.安装linuxdeployqt
linuxdeployqt 是Linux下的qt打包工具,可以将应用程序使用的资源(如库,图形和插件)复制到二进制运行文件所在的文件夹中。
去GitHub(点击此处下载)直接下载编译好的 linuxdeployqt-x86_64.AppImage 应用程序文件。
下载好之后,将其改名为linuxdeployqt,并chmod +x linuxdeployqt,然后复制到 /usr/local/bin/(此步可直接手动操作也可如下在命令行操作)。然后命令行输入 linuxdelpoyqt –version,查看是否安装成功,若输出版本信息表示安装成功。
$ chmod +x linuxdeployqt-x86_64.AppImage
$ mv linuxdeployqt-x86_64.AppImage linuxdeployqt
$ mv linuxdeployqt /usr/local/bin
$ linuxdelpoyqt --version
#输出的版本信息
linuxdeployqt 5 (commit 37631e5), build 631 built on 2019-01-25 22:47:58 UTC
2.配置QT的环境变量
修改用户目录下的 .bashrc 文件(在用户主页下按Ctrl+H,可找到隐藏文件;或者终端输入vim ~/.bashrc命令),在文件末尾追加以下内容,其中/home/zlkj/technology/5.9.7是我的Qt安装路径,大家要用自己的路径代替:
#add QT ENV
export PATH=/home/zlkj/technology/5.9.7/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=/home/zlkj/technology/5.9.7/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/zlkj/technology/5.9.7/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/home/zlkj/technology/5.9.7/gcc_64/qml:$QML2_IMPORT_PATH
最后要source一下使 ~/.bashrc 这个shell文件立即生效,而不必注销并重新登录。
$ source ~/.bashrc
3.打包应用程序
(1)运行Qt生成release版本的可执行文件,勾选了“shadow build”,所以示例用的是build-cleanRobot-Desktop_Qt_5_9_7_GCC_64bit-Release文件夹下的cleanRobot可执行文件;
(2)创建一个文件夹,名称最好是用可执行文件的名称,然后将cleanRobot可执行文件复制到此文件夹下;
(3)使用 linuxdeployqt 进行打包,一定要加上-appimage选项,命令如下:
$ linuxdeployqt cleanRobot -appimage
执行上面命令出现提示信息,不用管,只是创建了一个需要你自己编辑的desktop文件:
ERROR: Desktop file missing, creating a default one (you will probably want to edit it)
到这一步,就把可执行文件的动态库等依赖文件都复制到该文件夹中了。
4.编写开机脚本 runApp.sh
创建runApp.sh,写入以下内容:
#!/bin/bash
export LD_LIBRARY_PATH=/app/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/app/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/app/qml:$QML2_IMPORT_PATH
./cleanRobot
再给运行开机脚本runApp.sh添加可执行权限:
$ chmod +x runApp.sh
此时运行开机脚本,则可启动程序。其实到这一步就可以发布了,压缩成一个压缩包发布即可,可如果想继续打包成deb包,可以参考文章https://www.cnblogs.com/linuxAndMcu/p/11016322.html。
注意:文件夹要打包发布才可靠,打包能保障所有文件原封不动的复制,否则直接复制文件夹可能导致部分文件拷贝失败。例如.tar打包和解包的命令如下:
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
5.以上步骤完成打包发布后,在其他无QT环境的linux系统上如何安装呢?请继续往后看
首先解包文件夹,然后正常linux电脑直接运行可执行文件即可。然而有的linux系统会提示错误symbol lookup error: /opt/Qt/Tools/QtCreator/lib/Qt/plugins/platforms/../../lib/libQt5XcbQpa.so.5: undefined symbol: FT_Get_Font_Format,这是系统上缺少freetype或者freetype版本不对所致(解决方案参考https://superuser.com/questions/1451321/qt-startup-error-symbol-lookup-error-libqt5xcbqpa-so-5-undefined-symbol-ft-g),可直接下载freetype-2.8,然后手动安装(在终端输入命令如下):
rpm -Uvh freetype-2.8-12.el7.x86_64.rpm
至此,程序可正常运行了。
————————————————
版权声明:本文为优快云博主「拂晓看日出」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/nj2011zy/article/details/108264885