有时候编译了一个小工具,想发给其他同事使用,但是很容易缺少库,每次运行可执行文件的时候手动链接一次库就很麻烦,如果打包的时候将库全部打包好,并且链接好库,岂不美滋滋

在Linux中,打开终端,输入:

vim package_executable.sh

在按下 i ,进入编辑模式,

复制以下脚本,粘贴到终端中,按下esc,输入:wq  保存退出

#!/bin/bash

# 检查参数个数
if [ "$#" -ne 1 ]; then
    echo "Usage: $0 <executable_path>"
    exit 1
fi

EXECUTABLE_PATH=$1

# 检查可执行文件是否存在
if [ ! -f "$EXECUTABLE_PATH" ]; then
    echo "Error: Executable file not found at path '$EXECUTABLE_PATH'."
    exit 1
fi

# 创建输出目录
OUTPUT_DIR="executable_$(basename "$EXECUTABLE_PATH")"
mkdir -p "$OUTPUT_DIR/lib"

# 复制可执行文件到输出目录
cp "$EXECUTABLE_PATH" "$OUTPUT_DIR"

# 使用 ldd 列出所有依赖库并复制到输出目录
ldd "$EXECUTABLE_PATH" | grep -v 'not found' | awk '{print $3}' | xargs -I '{}' cp -v '{}' "$OUTPUT_DIR/lib/"

echo "可执行文件和依赖库已经添加到目录: $OUTPUT_DIR"


# 新增函数:生成start.sh脚本
generate_start_script() {
    local executable="$1"
    local lib_path="$2"

    cat << EOF > "$OUTPUT_DIR/start.sh"
#!/bin/bash

# 设置库文件查找路径
export LD_LIBRARY_PATH="$lib_path:\$LD_LIBRARY_PATH"

# 启动可执行文件
"./$executable"
EOF

    # 给start.sh脚本添加执行权限
    chmod +x "$OUTPUT_DIR/start.sh"
}

# ...(保留原有代码)

# 在这里调用函数生成start.sh
generate_start_script "$(basename "$EXECUTABLE_PATH")" "$OUTPUT_DIR/lib"


echo "start.sh 已在目录中生成脚本: $OUTPUT_DIR"
                                                                                                                                                                                                                                            

在终端给刚刚创建的脚本授权:

chmod 711 package_executable.sh

执行脚本:
 

./package_executable.sh app_name

会自动在当前目录创建一个新的目录,并打包好可执行文件(app_name)的所有依赖库,并将可执行文件和依赖库全部打包到新目录中,再新目录中创建start.sh脚本,执行start.sh可以启动可执行文件。

start.sh 主要是设置库文件查找路径的,建议通过start.sh来启动可执行文件

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐