这份代码是我写来管理第三方库的。
只要在新环境上运行这个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