美文网首页
合并静态库

合并静态库

作者: hotbox | 来源:发表于2018-10-09 10:58 被阅读0次

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


方法一、利用命令行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。


6EAC46C0-2FFB-476C-A9B1-0AB3B5B8F597.png

点击“+”,选择Aggregate


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

相关文章

  • iOS 静态库合并与静态库支持框架查询

    工作总结: 如何合并两个静态库? 终端命令: lipo -create 静态库1名 静态库2名 -output 新...

  • 合并静态库

    我们在工程自定义的静态库每次编译时会选择真机版本还是模拟器版本,每次编译只会生产其中的一个版本,所以为了能够同时支...

  • 静态库合并

    lipo -info xxx.a //查看架构 lipo -create 库1.a 库2.a 库3.a -out...

  • 合并.a静态库

    lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/ip...

  • 合并静态库

    lipo -create name1.a所在路径 name2.a所在路径 -output newname.a

  • 静态库相关

    1,查看一个静态库信息,XXX为静态库名称 lipo -info XXX 2,合并两个静态库 lipo -crea...

  • iOS打包.a静态库步骤

    打包静态库流程 1.创建静态库 2.实现类 3.公开.h文件 4.打包模拟器静态库 5.打包真机静态库 6.合并模...

  • 合并静态库 和 拆分静态库

    合并http://blog.csdn.net/koocui/article/details/76265546拆分h...

  • 制作.a与 -ObjC,-all_load的作用

    1. 使用命令 lipo -info 静态库名称 可以查看当前静态库支持的架构 2.#合并.a lipo -cre...

  • iOS静态库合并

    打开终端:lipo -create 真机.a 模拟器.a -output 合并.a 真机和模拟器的.a都直接拖入终...

网友评论

      本文标题:合并静态库

      本文链接:https://www.haomeiwen.com/subject/gakeaftx.html