(一)使用总结
1、Windows下打包后加壳合成一个exe文件可行;
2、Linux下打包,有两种方式一个脚本打包,一个是工具打包,两者有相同操作方式是执行”sudo ./xxx”;
3、Linux 下工具打包需要考虑低版本打包,高版本可运行,其中生成的桌面文件(.desktop)的形式可达到Windows双击exe的效果,但是
ubuntu兼容性上操作有差异太繁琐,不如直接在打包后的目录下运行“sudo ./demo”的方式;
4、Linux下类似Windows加壳工具appimagetool生成 demo-x86_64.AppImage,此方式生成的demo-x86_64.AppImage可双击运行,且无需考虑lib环境变量的问题,但是没有解决的是双击的时候怎么启动root权限,目前只能执行 sudo ./demo-x86_64.AppImage;
5、appimagetool龙芯下目前不支持,源码中只指定支持x86,源码尚未研究,后续更新;
6、Linux下将打包后的目录制作成iso写到CD区,在CD区直接运行命令可操作设备。
mkisofs -r -o ./demo.iso ./demo
(二)Windows下打包和加壳
1、windeployqt:执行 windeployqt xxx.exe 生成exe依赖的库文件,结果如下图:
缺点是文件太多,且占用空间大。
2、使用 Enigma Virtual Box 工具将上述打包文件生成独立的exe,可压缩生成,使生成的文件较小,此工具免费;
下载地址: https://enigmaprotector.com/en/downloads.html
如果不执行压缩的话,形成的独立的exe依然很大,执行压缩容量大小接近缩小一半。
(三)Linux下打包和加壳
Linux下打包目前共有两种方式可以参考,两种方式有不同之处,但是也可以执行相同的操作,就是sudo ./demo。
1、脚本的方式:此方法最简单,无需考虑版本兼容问题,只需执行脚本(sudo ./demo.sh)即可,使用命令进入可执行文件的目录下,然后新建两个shell脚本:
(1)pack.sh:用于拷贝程序链接的动态库要打包的文件夹中。
#!/bin/sh
exe="demo" #需要发布的程序名称
pwd="/home/ohuohuoo/Desktop/demo" #创建文件夹的位置
files=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $files $pwd
(2)demo.sh:此脚本名必须和要打包发布的程序名字相同。命令内容编写如下,不需要改动:
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
2、类比windeployqt,通过Linuxdeployqt部署打包:
(1)下载地址: https://github.com/probonopd/linuxdeployqt/releases
支持命令行执行和源码编译两种方式,但是命令行只支持x86下的;
(2)优先选择第一个,可直接命令执行,但是不论是源码还是命令行,仅能在ubuntu18.04以下运行,像ubuntu20.04编译运行时会提示系统版本太新的错误;
(3)设置QT环境:vim ~/.bashrc
#添加Qt环境 -- 需要换成自己的Qt安装路径
export PATH=/home/Qt5.10.1/5.10.1/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=/home/Qt5.10.1/5.10.1/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/Qt5.10.1/5.10.1/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/home/Qt5.10.1/5.10.1/gcc_64/qml:$QML2_IMPORT_PATH
设置完后,执行 source ~/.bashrc 立即生效;
(4)修改权限,执行
./linuxdeployqt-continuous-x86_64.AppImage demo -appimage
执行过程参考下图:
最终生成的文件列表:
生成后,把自己的库文件拷贝到lib下即可;
(5)生成以上打包文件后有两种操作方式:
(a)在上述目录下直接命令行执行“sudo ./demo”;
(b)双击桌面文件执行,但是桌面文件操作具有局限性,操作过于繁琐,而且对于ubuntu20.04 高版本的,在当前目录下是无法直接双击
执行,且无法设置文档为信任模式(gio 命令不支持设置 metadata::trusted yes属性),只能放到系统桌面下才能运行;
(c)Ubuntu系统下实验过:将生成的demo1打包文件夹中的demo1直接换成demo2也可行,但是得确定依赖的库文件是否能被找到,但是
最好的处理方式是每个demo重新执行打包;
(d)所有操作得保证对应可执行文件的依赖库是否被找到,可使用 ldd demo查看。
3、加壳合成一个可执行文件:
(1)下载地址: https://github.com/AppImage/AppImageKit/releases/
如上图所示,x86下可直接下载工具,如果是其他系统如龙芯,需要源码编译;
(2)加壳:修改可执行权限后执行:
./appimagetool-x86_64.AppImage 程序目录
生成可执行文件 demo-x86_64.AppImage,
然后执行 sudo ./demo-x86_64.AppImage
(四)国产机—龙芯
(1)因为上述工具没有支持mips,因此需要源码编译;
(2)编译linuxdeployqt:
(3)下载patchelf-0.12.tar.bz2可以,不能下载版本较高的,否则报错(下图是patchelf_0.14):
github地址:https://github.com/NixOS/patchelf
下载地址:https://github.com/NixOS/patchelf/releases
(4)其余插件可根据提示安装即可,安装完后便可正常编译成功,之后操作按照上述Linux下执行即可。
(5)待更新:源码后续研究。
(五)Linux下桌面文件(xxx.desktop)
需要修改default.desktop 文件如下:
注意:
(1)Icon 设置在ubuntu18.04上面不支持显示.ico格式的图标文件,ubuntu20.04可以;
(2)Exec 执行命令:ubuntu18.04下不支持以下格式输入,ubuntu20可以:
Exec=echo $PWD | sudo -S /home/xxx/xxx/demo,输入后不执行;
(3)ubuntu18.04下可在目录中双击运行,第一次运行时系统会提示为不信任文件,选择信任后即可运行,也可以放桌面上双击运行;
(4)ubuntu20.04下,只能将桌面文件拷贝到桌面才能用,但必须得有以下操作:
(a)修改权限,不能设置权限为0777,可以设置0755,否则下图中鼠标右键菜单中不会出现“允许启动”设置,相当于执行对文件设置可信任状态,点击“允许执行”;
(b)点击“允许执行”后,且如果文件中没有语法错误或者相关路径错误的话,桌面文件会自动更新为带图标的demo工具,如下图,但是建议最好检查下属性中“执行”是否选中为“允许执行文件”;
![在这里插入图片描述](https://img-blog.csdnimg.cn/00c511a7c7ea4e40b3d96ffd51b8254c.png
(c)如果文件中没有语法错误或者相关路径错误,双击文件依然不运行的话,需要检查下依赖的库文件,ldd demo查看。