MENU

linux编译so依赖库打包部署

August 30, 2025 • linux相关

使用 vcpkg 来管理第三方依赖库比较方便,特别是跨平台应用开发场景,不过链接so库时会出现以绝对路径链接情况,如果有打包部署需求时,则需要使用 patchelf 处理下 RPATH$ORIGIN,特别是系统库一般是没设置 RPATH的,而有时为以防万一目标系统上旧版本的so文件缺失需要一并跟包,具体命令如下:

apt update && apt install -y patchelf
patchelf --set-rpath '$ORIGIN' libstdc++.so.6

搞个脚本批量处理下:

#!/bin/bash
# deploy_script.sh

VCPKG_ROOT="/home/user/dev/vcpkg"
DEPLOY_DIR="$1"

# 创建部署目录
mkdir -p "$DEPLOY_DIR"

# 复制 vcpkg 编译的库
cp "$VCPKG_ROOT/installed/x64-linux-dynamic/lib/libaaaa.so"* "$DEPLOY_DIR/"
cp "$VCPKG_ROOT/installed/x64-linux-dynamic/lib/libcccc.so"* "$DEPLOY_DIR/"
cp "$VCPKG_ROOT/installed/x64-linux-dynamic/lib/libdddd.so"* "$DEPLOY_DIR/"
cp "$VCPKG_ROOT/installed/x64-linux-dynamic/lib/libeeee.so"* "$DEPLOY_DIR/"

# 复制系统运行时库
cp /lib/x86_64-linux-gnu/libgfortran.so.5 "$DEPLOY_DIR/"
cp /lib/x86_64-linux-gnu/libstdc++.so.6 "$DEPLOY_DIR/"
cp /lib/x86_64-linux-gnu/libgcc_s.so.1 "$DEPLOY_DIR/"

# 修改系统库的 RPATH
cd "$DEPLOY_DIR"
patchelf --set-rpath '$ORIGIN' libgfortran.so.5
patchelf --set-rpath '$ORIGIN' libstdc++.so.6
patchelf --set-rpath '$ORIGIN' libgcc_s.so.1

echo "Deployment complete. All libraries are now self-contained in $DEPLOY_DIR"