第三方库管理脚本(可实现把程序依赖的库一键安装到新环境上,在程序中需要指定rpath,其路径与脚本中RPATH_PREFIX要一致)

这份代码是我写来管理第三方库的。
只要在新环境上运行这个setup_env.sh脚本,就可以把脚本中指定的第三方库的so文件安装到RPATH_PREFIX目录下,并且把相关的头文件安装到INCLUDE_PREFIX目录下。

说到rpath,它是链接器的参数,在编译时,需要使用-Wl,-rpath,‘path_a’:'path_b"'种套路来指定(-Wl表明后面的参数要传递给链接器)(多个路径中间用冒号分隔)(,与‘之间不能有空格)。
在编译出的可执行文件上执行readelf -d path 可以看到该程序指定的rpath,例如:

    0x0000000f (RPATH)                      Library rpath: [/usr/local/lib]

下面是脚本正文,其中test函数是通用的机制函数,各种第三方库只要简单地填表就行了(参照mySQL库来填表),最后还需要在脚本中调用一下test函数来安装新的库,就像脚本中main部分那样。

[root@localhost195-46 kernel]# cat setup_env.sh 
#!/bin/bash

RPATH_PREFIX=/usr/smias/lib
INCLUDE_PREFIX=/usr/smias/include

################### mySQL lib ############################

MYSQL_PREFIX_PATH=./open_libs/install/mysql/mysql-5.7
MYSQL_LIB_PATH=${MYSQL_PREFIX_PATH}/lib
MYSQL_LIB_SLINK_NAME_ARRAY=(libmysqlclient.so.20 libmysqlclient.so)
MYSQL_LIB_REAL_NAME_ARRAY=(libmysqlclient.so.20.3.13 libmysqlclient.so.20)

MYSQL_INCLUDE_PATH=${MYSQL_PREFIX_PATH}/include
MYSQL_TARGET_INCLUDE_PATH=${INCLUDE_PREFIX}/mysql

#function install_mysql()
#{
#    cp ${MYSQL_LIB_PATH}/lib* ${RPATH_PREFIX}/

#    cd ${RPATH_PREFIX}    
#    for i in $(seq 0 $[${#MYSQL_LIB_SLINK_NAME_ARRAY[@]}-1]) 
#    do
#        echo "${MYSQL_LIB_REAL_NAME_ARRAY[$i]} ----> ${MYSQL_LIB_SLINK_NAME_ARRAY[$i]}"

#        rm ${MYSQL_LIB_SLINK_NAME_ARRAY[$i]} -f
#        ln -s ${MYSQL_LIB_REAL_NAME_ARRAY[$i]} ${MYSQL_LIB_SLINK_NAME_ARRAY[$i]}
#    done
#    cd - > /dev/null

#   if [ ! -d ${MYSQL_TARGET_INCLUDE_PATH} ]; then
#        mkdir -p ${MYSQL_TARGET_INCLUDE_PATH}
#    fi
#    cp ${MYSQL_INCLUDE_PATH}/*.h ${MYSQL_TARGET_INCLUDE_PATH}

#    return 0
#}

####################### nanomsg lib #############################

NNMSG_PREFIX_PATH=./open_libs/install/nanomsg_lib
NNMSG_LIB_PATH=${NNMSG_PREFIX_PATH}/lib64
NNMSG_LIB_SLINK_NAME_ARRAY=(libnanomsg.so.5 libnanomsg.so)
NNMSG_LIB_REAL_NAME_ARRAY=(libnanomsg.so.5.1.0 libnanomsg.so.5)

NNMSG_INCLUDE_PATH=${NNMSG_PREFIX_PATH}/include/nanomsg
NNMSG_TARGET_INCLUDE_PATH=${INCLUDE_PREFIX}/nanomsg

#function install_nnmsg()
#{
#    cp ${NNMSG_LIB_PATH}/lib* ${RPATH_PREFIX}/

#    cd ${RPATH_PREFIX}    
#    for i in $(seq 0 $[${#NNMSG_LIB_SLINK_NAME_ARRAY[@]}-1]) 
#    do
#        echo "${NNMSG_LIB_REAL_NAME_ARRAY[$i]} ----> ${NNMSG_LIB_SLINK_NAME_ARRAY[$i]}"

#        rm ${NNMSG_LIB_SLINK_NAME_ARRAY[$i]} -f
#        ln -s ${NNMSG_LIB_REAL_NAME_ARRAY[$i]} ${NNMSG_LIB_SLINK_NAME_ARRAY[$i]}
#    done
#    cd - > /dev/null

#    if [ ! -d ${NNMSG_TARGET_INCLUDE_PATH} ]; then
#        mkdir -p ${NNMSG_TARGET_INCLUDE_PATH}
#    fi
#    cp ${NNMSG_INCLUDE_PATH}/*.h ${NNMSG_TARGET_INCLUDE_PATH}

#    return 0
#}

#$1-----XXX_LIB_PATH
#$2-----XXX_LIB_SLINK_NAME_ARRAY
#$3-----XXX_LIB_REAL_NAME_ARRAY
#$4-----ARRAY_LEN
#$5-----XXX_INCLUDE_PATH
#$6-----XXX_TARGET_INCLUDE_PATH

function test()
{
    cp $1/lib* ${RPATH_PREFIX}/
    local s=($2)	#shell脚本传递数组参数的方式,必须用本地变量接收一下,不然$2只代表数组中的第一个元素
    local r=($3)

    cd ${RPATH_PREFIX}    
    for i in $(seq 0 $[$4-1])	 #i在0到$4-1这些值中loop,
    do
        echo "${r[$i]} ----> ${s[$i]}"

        rm ${s[$i]} -f
        ln -s ${r[$i]} ${s[$i]}
    done
    cd - > /dev/null

    if [ ! -d $6 ]; then
        mkdir -p $6
    fi
    cp $5/*.h $6

    return 0
    
}


#################### main ############################

if [ ! -d ${RPATH_PREFIX} ]; then
   mkdir -p ${RPATH_PREFIX} 
fi
if [ ! -d ${INCLUDE_PREFIX} ]; then
   mkdir -p ${INCLUDE_PREFIX} 
fi


test ${MYSQL_LIB_PATH} "${MYSQL_LIB_SLINK_NAME_ARRAY[*]}" "${MYSQL_LIB_REAL_NAME_ARRAY[*]}" ${#MYSQL_LIB_REAL_NAME_ARRAY[@]} ${MYSQL_INCLUDE_PATH} ${MYSQL_TARGET_INCLUDE_PATH}
#传数组的时候要使用双引号
#install_mysql
#install_nnmsg

exit 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值