前言
开发和部署过linux下c/c++程序的朋友会不会有这种感受,可执行文件依赖的动态库(.so)多了就很烦锁,特别是部署上线时,一般很先安装依赖(通过yum或者download原始编译安装),再找自己项目生成的文件copy到线上,最后就运行起来。其实如果开发环境和生产线上环境差别不大(内核版本一样)的话,就可以把程序所依赖的动态库一起copy过去放到ld能搜索到的目录就行了。 那我如何得知可执行文件依赖什么动态库呢,ldd命令不就可以吗,没错,我这里写了个小脚本就是做收集可执行文件的依赖动态库(so),脚本代码也简单,读者可往下查阅copy来用。
注意1:
有些系统的so要删掉,只挑选你自己需要的,如libstdc++.so.6 libm.so.6 libc.so.6 libgcc_s.so,.
因为新机器上也有,不删把人家的覆盖掉系统会出问题。
注意2:
当把收集到的so是常规文件,都不带符号链接的,所以放到新机器的ldconfig搜索到的目录后,要执行ldconfig(需要root),或者也可以用环境变量
LD_LIBRARY_PATH方式,这时有soname的库你得手动建立软链接。 加载动态库的流程不在此介绍了,可参考,大家也可自行查阅baidu、google。
运行:
像一般shell脚本那样运行即可,只需一个参数,就是你想收集的可执行文件(可以全路径或相对路径),输出目录就是多个.depend命令的目录。
#! /bin/sh set -e set -u file=$1 depsos=`ldd $file | awk '{print $3}'| grep '/'` dstpath="$file.depend" tmpfile='' if [ $# -gt 1 ]; then dstpath=$2 fi if [ ! -e $dstpath ]; then mkdir -p $dstpath fi cnt=0 for lfi in $depsos; do if [ -f $lfi ]; then if [ -h $lfi ]; then # echo "sambol file -> `readlink $lfi`" tmpfile=`readlink $lfi | xargs basename` cp $lfi $dstpath/$tmpfile else # echo "$lfi common file" cp $lfi $dstpath fi else echo "$lfi isnot a file, error" fi cnt=$[$cnt+1] done echo "pack $cnt so to $dstpath"