Qt程序打包发布——动态发布
2017-02-08 17:17
489 查看
最近由于工作需要,涉及到了Qt打包发布方面知识。以前对于打包的理解,仅仅是一个模糊的概念,经过此次的实践与苦苦摸索,终于有一个明确的概念。言归正传,下面通过这两天的经历来介绍发布过程。
首先,明确打包发布的目的。在开发完成一个app之后,不可能要求客户像开发人员一样把整个开发环境都安装上,所以,为了能够让客户最快、最简洁地使用,就需要开发人员提供一个最小、操作最简单的包。
在清楚目的之后,还需要了解Qt发布的方式(当然,几乎所有的app都通过两种方式发布):静态编译、动态发布方式。这里采用的是动态发布,也就是同时发布依赖动态库(linux下的.so,win下的.dll文件)。
在这里介绍下操作的环境:Centos7、Qt5.5.1,
接着,参考官方文档(http://doc.qt.io/qt-5/linux-deployment.html)可知,发布app需要拷贝可执行程序、Qt依赖库以及平台插件到同一个可执行程序包中;下面一步一步来:
1. 打包release版本——使用Qt Creater,选择release方式构建(这里需要知道Qt构建的目录,如果不清楚,可以点击选项->构建目录选择查看);
2. 将重新构建的release版本可执行文件拷贝到要发布的包中(这里选择的是release_packet);
3. 拷贝Qt依赖库——使用ldd命令查看可执行程序依赖的Qt库,然后拷贝进去可执行程序包中;如果不想手动拷贝,这里提供一个脚本:
#!/bin/sh
exe="NvNetCutStreamingServer" #发布的程序名称
des="./" #你的路径
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
4. 拷贝Qt平台插件——到Qt安装目录下将plugin下的platforms插件(我的Qt插件目录是/opt/apps/Qt5.5.1/Tools/QtCreator/bin/plugins/platforms/)拷贝进去。
5. 结合官方文档,新建一个与可执行程序同名的.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 "$@"
到测试机器上运行5中新建脚本,原以为大功告成了,结果出现了下面的错误:
This application failed to start because it could not find or load the Qt platform plugin "xcb".
Available platform plugins are: linuxfb, minimal, offscreen, xcb.
Reinstalling the application may fix this problem.
Aborted (core dumped)
在经过一番查找后,特别是参考了http://blog.csdn.net/braveyly/article/details/14005191的博客之后,我清楚了错误原因是缺少xcb依赖的库,用ldd一验证,果然是一部分依赖库没有找到,然后到开发环境上将这些库拷贝进去,最后运行程序,大功告成!
新人总结,文中如有不当之处,请各位大侠不吝指出。
首先,明确打包发布的目的。在开发完成一个app之后,不可能要求客户像开发人员一样把整个开发环境都安装上,所以,为了能够让客户最快、最简洁地使用,就需要开发人员提供一个最小、操作最简单的包。
在清楚目的之后,还需要了解Qt发布的方式(当然,几乎所有的app都通过两种方式发布):静态编译、动态发布方式。这里采用的是动态发布,也就是同时发布依赖动态库(linux下的.so,win下的.dll文件)。
在这里介绍下操作的环境:Centos7、Qt5.5.1,
接着,参考官方文档(http://doc.qt.io/qt-5/linux-deployment.html)可知,发布app需要拷贝可执行程序、Qt依赖库以及平台插件到同一个可执行程序包中;下面一步一步来:
1. 打包release版本——使用Qt Creater,选择release方式构建(这里需要知道Qt构建的目录,如果不清楚,可以点击选项->构建目录选择查看);
2. 将重新构建的release版本可执行文件拷贝到要发布的包中(这里选择的是release_packet);
3. 拷贝Qt依赖库——使用ldd命令查看可执行程序依赖的Qt库,然后拷贝进去可执行程序包中;如果不想手动拷贝,这里提供一个脚本:
#!/bin/sh
exe="NvNetCutStreamingServer" #发布的程序名称
des="./" #你的路径
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
4. 拷贝Qt平台插件——到Qt安装目录下将plugin下的platforms插件(我的Qt插件目录是/opt/apps/Qt5.5.1/Tools/QtCreator/bin/plugins/platforms/)拷贝进去。
5. 结合官方文档,新建一个与可执行程序同名的.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 "$@"
到测试机器上运行5中新建脚本,原以为大功告成了,结果出现了下面的错误:
This application failed to start because it could not find or load the Qt platform plugin "xcb".
Available platform plugins are: linuxfb, minimal, offscreen, xcb.
Reinstalling the application may fix this problem.
Aborted (core dumped)
在经过一番查找后,特别是参考了http://blog.csdn.net/braveyly/article/details/14005191的博客之后,我清楚了错误原因是缺少xcb依赖的库,用ldd一验证,果然是一部分依赖库没有找到,然后到开发环境上将这些库拷贝进去,最后运行程序,大功告成!
新人总结,文中如有不当之处,请各位大侠不吝指出。
相关文章推荐
- Windows平台下QT程序打包发布
- QT程序打包发布 - 免安装
- QT5.4 计算器程序 打包&发布,解决dll的最新解决方案
- linux+Qt程序如何打包发布
- Linux下Qt程序的打包发布
- qt动态发布带phonon的程序
- 如何发布基于Maemo5的Qt程序(打包.deb格式)
- Qt程序在windows 和 linux 下打包发布
- QT程序打包发布(双击运行)
- 利用QT自带的windeployqt打包发布程序
- NSIS打包发布Qt程序
- QT学习7:程序打包发布
- Qt 打包发布 不能动态打开图片显示问题
- Qt程序在win下简单打包发布
- QT程序打包发布
- 打包发布qt程序
- QT程序发布的一个问题:无法定位程序输入点与动态链接库QtCore4.dll
- Windows下Qt程序简单打包发布
- QT程序打包发布 - 免安装