什么是库?
库是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为 2 种类型
开源库
公开源代码,能看到具体实现
比如 SDWebImage 、 AFNetworking
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
静态库和动态库
静态库和动态库的存在形式
1:静态库: .a 和 .framework
2:动态库: .dylib 和 .framework
静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中, 被多次使用就有多份冗余拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存 。
创建静态库
1:新建工程并选择默认Target为Cocoa Touch Framework, 如图:
我们这里先选择Framework的形式,有人可能会说,这不是动态库吗,没错,我们可以把它改成静态库的形式,目前国内比较出名的SDK大部分都是采用framework的形式,如高德SDK,百度SDK,QQ SDK等,因为framework的包已经包含了头文件等信息,集成起来很方便;
2:我们添加一个类作为测试,如下图所示,添加一个函数,打印信息:
3:在编译前我们还需要做如下设置:
再header选项中,我们点击“+”号,把需要的头文件添加进去,默认是在private中,然后把需要暴露给外部的头文件拖到public中。
4:设置静态库的形式:
如上图所示,因为我们项目建立的生活选择的时动态库,在IOS中,苹果现在时不支持第三方动态库的,具体原因。。。。
5:设置ARCHS
Architectures:
指明选定Target要求被编译生成的二进制包所支持的指令集支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,从而会造成最终编译生成的包很大。
Valid Architectures:
指明可能支持的指令集并非Architectures列表中指明的指令集都会被支持,Valid Architectures限制可能被支持的指令集的范围,即Valid Architectures和Architectures列表的交集,才是XCode最终生成二进制包所支持的指令集。
比如,将Architectures支持arm指令集设置为:armv7,armv7s,对应的Valid Architectures的支持的指令集设置为:armv7s,arm64,那么此时,XCode生成二进制包所支持的指令集只有armv7s 。
Build Active Architecture Only:
指明是否只编译当前连接设备所支持的指令集。
我们把他们都设为NO,这样编译的时候就不会只编译当前可以使用的指令集了。
编译
我们在网上也看到很多SDK的编译方法,最原始的就是把模拟器和真机的分别编译,然后打开文件夹,使用lipo命令进行编译,但是这样操作很麻烦,而且这些都是一些重复性的工作,这里我使用了一个build.sh的脚本编译,使用的时候只需要把它放在工程的根目录下,然后再命令行执行./build.sh就完成啦!!!
脚本:
this_dir="$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)"
// 使用的时候,把这里改成你们项目的名称,重要!
FMK_NAME="SDKTEST"
INSTALL_DIR=${this_dir}/Products/${FMK_NAME}.framework
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
if [ -d "${INSTALL_DIR}" ]
then
echo "can't remove old Install path in IOSSDK!!!"
exit 1;
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
然后打开命令行执行:
编译成功后,我们可以再根目录下发现有一个Products文件,没错,打开里面就是我们最终需要的SDK,使用lipo -info查看指令集:
!!!! bingo !!!!
测试