zoukankan      html  css  js  c++  java
  • Linux Debian 如何部署 Qt?

    Linux Debian 如何部署 Qt?

    在这里以 HelloWorld 为例

    目录结构如下:

    .
    ├── HelloWorld
    ├── HelloWorld.sh
    ├── imageformats
    │   ├── libqgif.so
    │   ├── libqicns.so
    │   ├── libqico.so
    │   ├── libqjpeg.so
    │   ├── libqsvg.so
    │   ├── libqtga.so
    │   ├── libqtiff.so
    │   ├── libqwbmp.so
    │   └── libqwebp.so
    ├── libicudata.so.56 -> libicudata.so.56.1
    ├── libicudata.so.56.1
    ├── libicui18n.so.56 -> libicui18n.so.56.1
    ├── libicui18n.so.56.1
    ├── libicuuc.so.56 -> libicuuc.so.56.1
    ├── libicuuc.so.56.1
    ├── libQt5Core.so.5 -> libQt5Core.so.5.9.5
    ├── libQt5Core.so.5.9.5
    ├── libQt5DBus.so.5 -> libQt5DBus.so.5.9.5
    ├── libQt5DBus.so.5.9.5
    ├── libQt5Gui.so.5 -> libQt5Gui.so.5.9.5
    ├── libQt5Gui.so.5.9.5
    ├── libQt5Widgets.so.5 -> libQt5Widgets.so.5.9.5
    ├── libQt5Widgets.so.5.9.5
    ├── libQt5XcbQpa.so.5 -> libQt5XcbQpa.so.5.9.5
    ├── libQt5XcbQpa.so.5.9.5
    ├── platforminputcontexts
    │   ├── libcomposeplatforminputcontextplugin.so
    │   ├── libfcitxplatforminputcontextplugin.so
    │   ├── libibusplatforminputcontextplugin.so
    │   └── libqtvirtualkeyboardplugin.so
    ├── platforms
    │   ├── libqeglfs.so
    │   ├── libqlinuxfb.so
    │   ├── libqminimalegl.so
    │   ├── libqminimal.so
    │   ├── libqoffscreen.so
    │   ├── libqvnc.so
    │   └── libqxcb.so
    ├── platformthemes
    │   └── libqgtk3.so
    └── xcbglintegrations
        ├── libqxcb-egl-integration.so
        └── libqxcb-glx-integration.so
    
    

    其中 HelloWorld.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 "$@"
    

    HelloWorld.sh 脚本中设置了 LD_LIBRARY_PATH 环境变量,即 ldd 脚本命令搜索的动态依赖库的路径。
    然后运行以以脚本名称的一个应用(故脚本名称需要和应用名称一致),当然你也可以在 /etc/profile 环境变量文件中自由的添加该环境变量,类似这样的LD_LIBRARY_PATH=/home/app/HelloWorld

    也可以直接在命令行终端添加这样的语句

    # 添加临时的环境变量,仅在该命令行终端有效。
    export LD_LIBRARY_PATH=/home/app/HelloWorld
    

    详细部署请自行查看
    http://doc.qt.io/qt-5/linux-deployment.html


    值得一提的是动态库依赖需要软链接

    这里以 libQt5Core.so.5.9.5 为例

    # 其中 libQt5Core.so.5 就是软链接指向 libQt5Core.so.5.9.5
    ├── libQt5Core.so.5 -> libQt5Core.so.5.9.5
    ├── libQt5Core.so.5.9.5
    

    如果你不复制软链接到程序目录中,仅复制 libQt5Core.so.5.9.5 ,使用 ldd 命令可以查看看无法需要到该动态库。

    # 查看应用程序依赖
    ldd HelloWorld
    # 查看动态库依赖
    ldd libQt5Core.so.5.9.5
    

    如果想另外设置插件目录可以设置 QT_QPA_PLATFORM_PLUGIN_PATH 环境变量。

    # 设置一个目录
    export QT_QPA_PLATFORM_PLUGIN_PATH=/home/app/HelloWorld/plugins
    
    # 设置多个目录 : 相隔即可
    export QT_QPA_PLATFORM_PLUGIN_PATH=/home/app/HelloWorld/plugins:/home/app/HelloWorld:/home/app
    

    或者使用 qt.conf 文件指定,放置到应用程序目录下即可。

    [Paths]
    Plugins=/path/to/plugins
    

    查看具体加载插件信息

    export QT_DEBUG_PLUGINS=1
    

    复制动态库脚本
    该脚本会复制程序依赖到运行该脚本的目录中
    lddExport.sh

    #!/bin/sh
    # 应用程序名称
    exe="HelloWorld"
    
    # 取脚本名称
    #exe=`basename $0 | sed s,.sh$,,`
    #ehco $exe
    
    # 应用程序目录
    des="/home/app/HelloWorld"
    
    deplist=$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')
    cp $deplist $des
    

    设置 export LD_LIBRARY_PATH 环境变量会导致 segmentation fault 段错误

    清除冲突动态库即可,即每个系统版本的平台依赖的库。
    比如 libX11.so.6 libxcb.so.1``libXau.so.6``libXdmcp.so.6``libbsd.so.0``librt.so.1

  • 相关阅读:
    类的静态成员
    QT上的Mysql编程
    将博客搬至CSDN
    ARM开发板系统移植-----rootfs的制作
    ARM开发板系统移植-----kernel的编译
    ARM开发板系统移植-----u-boot的编译
    Linux 消息队列编程
    Linux 共享内存编程
    Linux 信号量同步编程
    Linux 信号量互斥编程
  • 原文地址:https://www.cnblogs.com/cheungxiongwei/p/10137438.html
Copyright © 2011-2022 走看看