• Ubuntu18下打包Qt程序


    如题,近期因为项目需求,得打包QT程序,并将程序放到没有安装QT库的电脑上运行。网上索罗了下,打包QT程序的方式很多,主要分为以下几种:

    1. 打包成安装包形式;

    2. 打包成二进制文件,附带运行库的形式:

    • windows下,有很多工具,教程也比较多,运行库基本是dll文件
    • linux下,需要靠脚本协助,很多教程都不完整,运行库基本是so文件

    笔者这里只演示如何在linux下打包免安装程序,程序名称为giptables,QT版本是5.7.1,以下如出现这个名称,则一律替换成读者自己的应用程序名称。

    0、找个地方,比如桌面,创建空文件夹Giptables,这个将用来存放giptables程序的运行文件

    1、先将工程使用Release模式编译

    2、打开编译输出文件的文件夹(带二进制文件giptables的那个)

    笔者的文件夹名称是build-giptables-Desktop_Qt_5_7_1_GCC_64bit-Release
    

    3、在上一步的文件夹中新建文件copylib.sh,通过指令设置权限chmod 777 copylib.sh

    4、在 copylib.sh 中加入内容

    #!/bin/bash
    
    LibDir=$PWD"/lib"
    Target=$1
    
    lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
    
    $(mkdir $LibDir)
    
    for Variable in ${lib_array[@]}
    do
        cp "$Variable" $LibDir
    done
    

    5、打开终端并进入到当前文件夹,输入./copylib.sh giptables

    其中, giptables 是运行copylib.sh 脚本的参数,脚本实际上是调用了 ldd giptables指令获得giptables运行时需要哪些库,并将库都复制放到当前目录的lib文件夹中。
    

    运行完上述指令后,同目录下会生成lib文件夹,这里我们将其称作giptables的库文件夹,避免与下文内容混淆

    6、将giptables的二进制文件和 giptables的库文件夹里所有的文件复制到Giptables文件夹中,注意:这里是把lib里的所有文件复制出来,不用复制lib文件夹

    7、进入QT的安装目录,找到platforms文件夹,笔者的路径是

    ~/Qt5.7.1/5.7/gcc_64/plugins/platforms
    将整个platforms文件夹复制到Giptables文件夹中,注意:这时复制的是整个文件夹,这使得Giptables文件夹中会多出一个platforms文件夹
    

    8、将上文的copylib.sh放到Giptables/platforms/中,并运行./copylib.sh libqxcb.so,这时会得到lib文件夹——libqxcb.so的库文件夹

    ps:为什么是libqxcb.so呢?具体看文末的参考资料,这个跟你要运行的程序有关,需要用到哪些QT的库,就再打包对应的东西。

    9、将libqxcb.so的库文件夹中的所有文件复制Giptables文件夹中,然后删除掉Giptables/platforms/lib文件夹

    10、在Giptables文件夹中新建脚本giptables.sh,执行chmod 777 giptables.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 "$@"
    

    到这里就基本完成了,将Giptables文件夹复制到需要运行程序的目标主机即可,在目标主机中,运行程序,都采用 ./giptables.sh而不是./giptables,即运行程序的sh脚本,而不是二进制文件

    过程中遇到的问题:
    1、运行copylib.sh时报找不到库的错误:必须保证在源文件夹中运行copylib.sh,而不能先将文件复制出来,然后再运行copylib.sh生成lib
    2、在目标主机中提示

    This application failed to start because it could not find or load the Qt platform plugin “xcb”
    

    这是因为没有生成libqxcb.so的库文件夹,或者没有将生成的文件夹中所有的文件放到giptables.sh同一级目录下,笔者最后生成的目录结构如下

    Giptables(文件夹) -- platforms(文件夹) -- libqxcb.so
                     |                    \__ *.so
                     |
                     \__ giptables.sh
                     \__ *.so
    
    

    参考资料 http://doc.qt.io/qt-5/linux-deployment.html

    原文链接:https://blog.csdn.net/z3512498/java/article/details/64922180

  • 相关阅读:
    About Spring
    execle导入后 数据 无刷新 显示在 输入页面
    前端小神龟 -- 分页导航栏
    如何在mysql命令窗口获取到程序正在执行的sql语句
    div+css(ul li)实现图片上文字下列表布局
    C#异常之(已有打开的与此 Command 相关联,已有打开的与此命令相关联的 DataReader,必须首先将它关闭。)
    台灣VR內容產業聯盟_技術推廣中心
    2014新的一年到来,祝大家新年快乐
    matlab 提取文件路径名称,用于实现遍历读取文件(我的目的是遍历图像)
    无监督学习一些算法的简要概括(一)-稀疏自编码
  • 原文地址:https://www.cnblogs.com/pozhu15/p/12903672.html
Copyright © 2020-2023  润新知