合并静态库

我们在工程自定义的静态库每次编译时会选择真机版本还是模拟器版本,每次编译只会生产其中的一个版本,所以为了能够同时支持模拟器和真机调试,我们通常会将编译好的两个版本的静态库进行合并。具体的合并方法如下:


方法一、利用命令行lipo进行直接合并

1、首先我们需要分别编译真机版本和模拟器版本的静态库。
2、然后在终端上利用lipo create命令来进行合并。

  //如果是.a de 静态库
  lipo -create "${DEVICE_DIR}" "${SIMULATOR}" -output "${INSTALL_DIR}"
 //如果是.framework的静态库
lipo -create "${DEVICE_DIR}/{$ProjectName}" "${SIMULATOR}/{$ProjectName}" -output "${INSTALL_DIR}/{$ProjectName}"

注意.a的静态库与.framework的静态库是不一样的,.framework需要在framework的文件下找到需要合并的库文件进行操作,而不是直接对.framework文件进行合并,否则会报错无法合并。

3、合并完成后,可以用lipo -info 命令来查看是否支持真机和模拟器。

//如果是.a的静态库
lipo -info libMyLib.a
//如果是.framework的静态库
lipo -info MyFramework.framework/MyFramework

方法二、使用Shell脚本来进行合并。

1、在静态库的工程中添加一个新的target。


合并静态库_第1张图片
6EAC46C0-2FFB-476C-A9B1-0AB3B5B8F597.png

点击“+”,选择Aggregate


合并静态库_第2张图片
A7131EE6-B43F-4EC3-A7C8-33989325811E.png

然后添加脚本文件,.a静态库脚本文件如下:


if [ "${ACTION}" = "build" ]
then

#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"

#build之后的文件夹路径
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"

#真机build生成的头文件的文件夹路径
DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME}
echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"

#真机build生成的.a文件路径
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a
echo "DEVICE_DIR_A=${DEVICE_DIR_A}"

#模拟器build生成的.a文件路径
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a
echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"

#目标文件夹路径
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
echo "INSTALL_DIR=${INSTALL_DIR}"

#目标头文件文件夹路径
INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"

#目标.a路径
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
echo "INSTALL_DIR_A=${INSTALL_DIR_A}"

#判断build文件夹是否存在,存在则删除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi

#判断目标文件夹是否存在,存在则删除该文件夹
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#创建目标文件夹
mkdir -p "${INSTALL_DIR}"

#build之前clean一下
xcodebuild -target ${target_Name} clean

#模拟器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator

#真机build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos

#复制头文件到目标文件夹
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"

#合成模拟器和真机.a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"

#打开目标文件夹
open "${INSTALL_DIR}"

fi

framework版本脚本文件如下:

if [ "${ACTION}" = "build" ]
then

#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"

#build之后的文件夹路径
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"

#真机build生成的头文件的文件夹路径
#DEVICE_DIR_INCLUDE=${build_DIR}/Release-    iphoneos/include/${PROJECT_NAME}
#echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"

#真机build生成的.framework文件路径
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/${PROJECT_NAME}.framework
echo "DEVICE_DIR_A=${DEVICE_DIR_A}"

#模拟器build生成的.framework文件路径
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/${PROJECT_NAME}.framework
echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"

#目标文件夹路径
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
echo "INSTALL_DIR=${INSTALL_DIR}"

#判断build文件夹是否存在,存在则删除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi

#判断目标文件夹是否存在,存在则删除该文件夹
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#创建目标文件夹
mkdir -p "${INSTALL_DIR}"

#build之前clean一下
xcodebuild -target ${target_Name} clean

#模拟器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator

#真机build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos

#复制头文件到目标文件夹
cp -R "${DEVICE_DIR_A}/" "${INSTALL_DIR}/"

#合成模拟器和真机.framework包
lipo -create "${DEVICE_DIR_A}/${PROJECT_NAME}" "${SIMULATOR_DIR_A}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"

#打开目标文件夹
open "${INSTALL_DIR}"

fi

你可能感兴趣的:(合并静态库)