跳转至

Linux下打包动态链接的程序

linux下打包动态链接的程序

要点:

  • 带上需要的动态库(.so)
  • 使用足够低版本的glibc

一个简单打包脚本,script/do_pack.sh

#!/bin/bash

PROJ=protocol-test

SCRIPT_DIR=$(cd "$(dirname "$0")";pwd)
SRC_DIR="$SCRIPT_DIR/.."
BUILD_DIR="$PWD/build"
GIT_VER=$(git -C $SRC_DIR rev-parse --short HEAD)
PACK_NAME="${PROJ}-${GIT_VER}"
PACK_DIR="$BUILD_DIR/${PACK_NAME}"

copy_lib () {
        LibDir=$2
        Target=$1
        lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
        $(mkdir -p $LibDir)
        for Variable in ${lib_array[@]}
        do
            cp -vf "$Variable" "$LibDir"
        done
}

echo 准备环境...
rm -r "$BUILD_DIR"
mkdir -p "$BUILD_DIR" "$PACK_DIR"

echo 编译...
mkdir "$BUILD_DIR/bin" && cd "$BUILD_DIR/bin"
qmake "$SRC_DIR"
make -j16
cp "$PROJ" "$PACK_DIR/_$PROJ"
cp -vf "$SCRIPT_DIR/_run_packed_proj.sh" "$PACK_DIR/$PROJ"


# 删除glibc相关文件,使用目标系统上的GLIBC
# 由于GLIBC向前兼容,请在GLIBC较老的Linux版本上编译以获得最大兼容
echo 加入依赖库...
copy_lib "$BUILD_DIR/bin/${PROJ}" "$PACK_DIR"
cd $PACK_DIR
rm -rf libc.* libpthread.* ld-linux-* librt.*

echo 打包...
cd $PACK_DIR/..
cp -vf $SRC_DIR/res/* "$PACK_DIR"
tar -czvf "$PACK_NAME.tar.gz" "${PACK_NAME}"

script/_run_packed_proj.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 "$@"

一般还会使用patchelf把依赖的动态库的路径改了,这里没做,可能会有无法使用的情况。