gccコンパイル:いくつかパッケージする.o和.aファイルは新しいです.aファイル

2240 ワード

シーンを使用:
gccがcppをコンパイルときに生成する.o,それから若干.oファイルはパッケージ生成する.aファイル
しかし、时には必要です.oと複数.a,パッケージ生成最終の1つ.aファイル
*.o  --------\
xxx.a              --------->  des.a  
bbb.a ------/
gccコンパイル:いくつかパッケージする.o和.aファイルは新しいです.aファイル
方法:
       ,        rebuild_archive.sh,    Makefile     ,     :
sh ./rebuild_archive.sh   .a     .a ,,....  .o,,,,,

sh ./rebuild_archive.sh  libdes.a  libda_frame.a libda_dso_dll.a_da.o libda_dso_dll.a_daconf.o libda_dso_dll.a_damain.o


#!/bin/sh


# Usage: sh rebuild_archive.sh  guo.a libda.sf_dll.a da_version.o 


if [ "$#" -lt "1" ]; then
echo "param error for archive rebuild.sh"
fi


#      
PARAM_STR=$*
#     
TARGET=$1

TARGETTMPDIR=$TARGET.rebuild_archive
ARMACTEMPOBJ=$TARGET.rebuild_archive.ar.mac


test -d $TARGETTMPDIR && (echo "[FATAL]: some process running for $TARGET" && exit 0)
test -d $TARGETTMPDIR.2nd && (echo "[FATAL]: some process running for $TARGET" && exit 0)


rm -rf $TARGETTMPDIR
rm -rf $TARGETTMPDIR.2nd
mkdir -p $TARGETTMPDIR
mkdir -p $TARGETTMPDIR.2nd


echo OPEN ${TARGET} > $TARGETTMPDIR/$ARMACTEMPOBJ


for line in  ${PARAM_STR#* }
do
    SUFFIX=`echo ${line:0-2}`


    #         .a,      .o      
    if [ "$SUFFIX" = ".a" ];then
    #echo "this is .a : $line, extract it to tmpdir" 
    echo ADDLIB $line >> $TARGETTMPDIR/$ARMACTEMPOBJ
    fi


    #         .o,   cp      
    if [ "$SUFFIX" = ".o" ];then
    #echo "this is .o : $line, copy it to tmpdir" 
    cp -f $line $TARGETTMPDIR || exit $?
    fi


#         
# ignore other file types 
done


echo SAVE >> $TARGETTMPDIR/$ARMACTEMPOBJ
echo END >> $TARGETTMPDIR/$ARMACTEMPOBJ


#     
OOO_NUM=`ls ${TARGETTMPDIR}/*.o  | wc -l`
if [ "$OOO_NUM" -gt "0" ];then
cd ${TARGETTMPDIR} && ar crs ../${TARGET} ./*.o && cd - &&  ar -M < $TARGETTMPDIR/$ARMACTEMPOBJ || exit $?
else
sed -i 's/OPEN/CREATE /g' $TARGETTMPDIR/$ARMACTEMPOBJ 
ar -M < $TARGETTMPDIR/$ARMACTEMPOBJ || exit $?
fi




rm -rf $TARGETTMPDIR
rm -rf $TARGETTMPDIR.2nd