简述
静态库通常用于隐藏功能实现代码,使用者只能通过头文件调用相关接口,而无法知道其中的实现细节。同样的还有动态库(动态链接库),两者之间的主要区别在于:静态库可以编译到我们的应用程序中,应用程序可以在没有静态库的环境中运行;而动态库不能被编译到我们的应用程序中,应用程序必须在有动态库的环境下才能正常运行。
下面简单介绍下如何创建静态库。
创建工程
Xcode -> File -> New -> Project, 在弹出的工程创建选项中,选择
Cocoa Touch Static Library
, 填入相关信息完成静态库工程的创建。
编译静态库
这里提供两种编译生成静态库的方式,xcodebuild方式
和手动build方式
:
- xcodebuild方式
$ xcodebuild -target <iphonesimulator-lib.a> -configuration Release -sdk iphonesimulator -arch i386 -arch x86_64
// 针对模拟器运行的静态库$ xcodebuild -target <iphoneos-lib.a> -configuration Release -sdk iphoneos -arch armv7 -arch arm64
// 针对真机运行的静态库
-
手动build方式
- 选择
iOS Simulator
-> Command+B, 编译成功后,工程Projcets结构下显示的*.a
文件即是编译成功的静态库文件,右键Show in Finder
找到该文件 - 选择
Build Only Device
-> Command+B, 编译成功后,工程Projcets结构下显示的*.a
文件即是编译成功的静态库文件,右键Show in Finder
找到该文件
- 选择
注1:建议编译打包之前先进行清理工作,这样可以确保打出来的包是干净的。xcodebuild命令:$ xcodebuild clean -project <name.xcodeproj> -alltargets
;手动方式:Xcode菜单 -> Product -> Clean, 进行清理即可。
注2:两种方式的步骤1. 2.中都分别编译生成了两份静态库文件,这是因为在iphonesimulator
环境下编译的静态库只能供模拟器使用,在iphoneos
环境下编译的静态库只能供真机环境使用。可以使用命令$ lipo -info <lib.a>
查看对应静态库文件的属性,两个库文件对应的信息如下:
-
iOS Simulator
rchitectures in the fat file: lib.a are: armv7 arm64
-
Build Only Device
input file libHTMF.a is not a fat file
Non-fat file: libHTMF.a is architecture: x86_64
合并静态库
为了方便使用,通常会将编译生成的两个静态库文件(模拟器/真机)合并成一个文件进行使用。合并后的文件体积会有所变大,一般情况下为先前两个文件的和,所以实际项目发版时,建议只导入真机使用静态库文件。合并命令如下:
$ lipo -create <iphoneos-lib.a> <iphonesimulator-lib.a> -output <lib.a>
使用静态库
将.a
、.h
、资源文件
拖入实际项目,在想使用静态库的类中导入头文件,即可使用。
关于启用Bitcode
iOS9开始支持bitcode,能够根据用户设备安装对应的二进制版本,从而减少对手机存储空间的占用。Xcode7默认开启bitcode支持,这就要求工程内部所使用到的静态库都要支持bitcode(否则无法通过编译),除非关闭整个工程对bitcode的支持。
通过使用xcodebuild
工具打包时设置OTHER_CFLAGS
参数为-fembed-bitcode
可以成功编译出支持bitcode的静态库文件,具体命令如下:
$ xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target <iphonesimulator-lib.a> -configuration Release -sdk iphonesimulator -arch i386 -arch x86_64
// 针对模拟器运行的静态库
$ xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target <iphoneos-lib.a> -configuration Release -sdk iphoneos -arch armv7 -arch arm64
// 针对真机运行的静态库
然后合并两个静态库。