Linux打包发布qt应用程序
Qt应用程序在windows下打包相对比较简单;Linux下使用Qt进行开发的程序,如果想要在其他搭载Linux系统的主机上运行则需要将要发布的Qt程序依赖的一些动态链接库一起打包,主要方法:Linux系统下可以手写一个脚本文件,充分利用ldd命令进行打包。
一.环境介绍
操作系统环境: ubuntu18.04 64位
QT版本: 5.12.4
二.编译文件
- 在Qt中使用release的方式编译出可执行文件;
- 新建一个文件夹,将可执行文件拷贝进去备用。
三.使用脚本文件获取依赖库文件
1. 编写脚本文件
使用命令进入可执行文件的目录下,然后在这个空目录下新建一个文件(pack.sh),文件内容如下:
#!/bin/sh
exe="myApp"#需发布的程序名称
des="xxxxx"#步骤一中新建目录的完整路径
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
2. 赋予脚本文件权限并执行
chmod 777 pack.sh
./pack.sh
可执行文件依赖的链接库将会拷贝到所在的目录
3. 拷贝所依赖的qt平台的库文件
为了发布过程不出现各种BUG,找不到库、找不到平台等等一系列问题,现在使用一个笨办法。
将QT使用的编译器目录下的所有库拷贝到上述所建文件夹下。
查找本机QT安装路径,我的安装路径为: /opt/Qt5.14.2/5.14.2/gcc_64/
将QT使用的编译器目录下的plugins文件夹拷贝到上述文件夹目录下(主要依赖platform文件夹所包含的库文件,可以实验只用platform库文件程序是否可以正常运行)。这样得到的文件可能会比较多,然后在保证程序正常运行的情况下,可以尝试删除无用的库文件。
注:直接ldd命令和可能遇到缺少库问题
直接使用linux的ldd命令也可以查找可执行文件的依赖库,ldd命令和脚本功能一样,写成脚本是为了方便,查找之后就拷贝过来。使用ldd命令查找到依赖库需要自己一个个去当前系统中查找,命令示例:
ldd myapp
可能会遇到提示无法加载xcb插件等类似问题,一般这种问题就是缺少了动态库的依赖环境
libQt5XcbQpa.so.5
libQt5Dbus.so.5
这是两个链接,需要使用命令来查看Qt不同版本对应的这两个文件的实体文件(直接拷贝链接文件无效),进入Qt安装环境中下的lib库,一般是/Qt5.xx.x/xx.x/gcc_xx/lib这路径,进入后找到并复制到打包文件夹中。
即将原来的链接文件删除,并把文件复制进来并修改为原来的链接文件名。
四.编写执行脚本
1. 编写执行脚本
使用命令进入可执行文件的目录下,然后新在这个空目录下新建一个文件(myapp.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
echo $LD_LIBRARY_PATH
export PATH=$LD_LIBRARY_PATH:$PATH
echo $PATH
$dirname/$appname "$@"
此脚本目的是为了设置环境变量,告诉执行程序库所在的路径,所以可以写一个shell脚本方便程序的部署,直接使用脚本启动程序即可。其中,带echo的两行脚本只是为了能在终端看到路径的名称,为了调试方便。
注:需要注意的是,最后让程序运行的是脚本,所以我们直接运行myapp.sh这个脚本让程序运行成功,此文件名必须和执行程序同名,且在同一目录下。
2. 赋予执行脚本文件权限并执行
chmod 777 myapp.sh
./myapp.sh