• Linux 程序打包


    前言

    当我们在linux系统上开发一些工具时,想快速分发给相关人员使用时,我们可以把开发的相关依赖进行打包,然后分发使用,其中打包过程中遇到一些问题,在没有安装Qt的机器上运行回报缺少xcb库,通过ldd查找libqxcb.so的依赖并进行打包即可。还有一个问题就是软连接的问题,一些依赖库都是软链接,cp的时候有时会出现只copy符号,后来不知道什么原因,复制的时候会把软链接对应的实际内容复制过来,问题就迎刃而解了。

    基本步骤

    1. 依赖库的打包,可以在写成pack.sh文件,把Program程序复制到bin路径,然后把依赖库复制到当前路径下。还需要打包qt的plugins里的platforms库放在bin路径下,最后还需把libqxcb.so的依赖库一起打包。
    #!/bin/bash
    
    #exe="Program"
    #des=$(pwd)
    #deplist=$(ldd $exe |awk '{if (match($3,"/")){printf("%s "),$3}}')
    #cp $deplist ${des}
    
    copylib(){
        if [ $# -ne 2 ]
        then
        	echo "Usange: $0 target destination"
        	exit 1
        fi
        Target=$1
        Des=$2
        echo "Target:$Target"
        echo "Des:$Des"
        lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
        for Variable in ${lib_array[@]}
        do
            cp "$Variable" $Des
        done
    }
    #copy program depens
    exe="Program"
    des=$PWD
    copylib $exe $des
    #copy qt platforms
    cp -r /usr/local/qt/5.15.2/gcc_64/plugins/platforms/ ./
    #copy xcb depens
    cd platforms
    exe=libqxcb.so
    copylib $exe $des
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    1. 整体打包,可以写成sh文件,对相关配置文件,依赖库统一打包,并生成zip文件
    inputCmd=$1
    rootDir=$(pwd)
    echo "${rootDir}"
    pkgName=$(date +%Y%m%d_%H%M%S)
    echo $pkgName
    build_debug_package(){
    # create package dir
    bindir="package/debug/bin"
    configdir="package/debug/config"
    mkdir -p $bindir
    mkdir -p $configdir
    cp ./package/pack.sh ./$bindir
    cp ./package/Program.sh ./$bindir/../
    cp ./readme.txt ./$bindir/../
    cp ./bin_debug/Program ./$bindir
    cp -r ./config $configdir/../
    
    cd $bindir
    echo "#-1: start collect all the libriares"
    
    chmod 777 pack.sh
    ./pack.sh
    
    cd ../ #package dir
    
    tar zcvf LAT_debug_${pkgName}.tar.gz bin config Program.sh readme.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    1. 编写启动脚本如Program.sh,设置环境变量等,如把依赖库的路径改为当前路径下的库
    #!/bin/bash
    cd bin
    appname=`basename $0 | sed s,\.sh$,,`
    dirname=`dirname $0`
    PATH=$PATH:$PWD
    echo "PATH=$PATH"
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD
    echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
    export PATH
    export LD_LIBRARY_PATH
    #export QT_DEBUG_PLUGINS=1
    #echo $(ldd LocalizerTool)
    $dirname/$appname "$@"
    #QT_QPA_PLATFORM=offscreen $dirname/$appname "$@"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 小结
      可以通过3个脚本文件进行打包和运行
      –makepackage.sh
      –packdep.sh
      –program.sh

    拓展

    可以通过docker,使用nginx搭建静态文件服务器,把工具包上传到服务器供其他人使用.

    1. 使用docker-compose启动nginx镜像, yml文件如下:
    version: "2.0"
    
    services:
      nginx-ftp:
        image: nginx:latest
        restart: always
        ports:
          - "80:80"
        volumes:
          - /home/user/docker_work/nginx/nginx.conf:/etc/nginx/nginx.conf
          - /home/user/docker_work/build_files:/home/build_files
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 配置conf文件
    user  root;
    worker_processes  auto;
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        server {
            listen   80;
    
            location / {
              autoindex on;
              root   /home/build_files;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    1. 把打包的库放在本地对应的路径下,启动nginx后即可通过web进行访问下载
      docker-compose up
  • 相关阅读:
    SAP中外协加工收货与反冲消耗数量不一致的产生原因分析和解决案例二
    Node.js 零基础入门 Node.js 零基础入门第二天 2.4 模块的加载机制
    迅为IMX8M开发板安装VMware Tool工具
    Redis高可用之持久化
    brew 下载 nvm 之后,nvm command not found
    Linux三大搜索指令的区别
    2022-09-02 mysql/stonedb-读取Pack数据流程记录
    Java基础- StringBuilder & StringBuffer
    SSH安全登录远程主机
    深度讲解TS:这样学TS,迟早进大厂【17】:类
  • 原文地址:https://blog.csdn.net/baidu_34788529/article/details/127746799