Qt程序打包发布——动态发布

来源:互联网 发布:网络信号转换器 编辑:程序博客网 时间:2024/05/21 17:23

        最近由于工作需要,涉及到了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一验证,果然是一部分依赖库没有找到,然后到开发环境上将这些库拷贝进去,最后运行程序,大功告成!

        新人总结,文中如有不当之处,请各位大侠不吝指出。

1 0
原创粉丝点击