iOS

iOS开发|静态库创建

Cocoa Touch Static Library

Posted by Jack on April 27, 2014

简述

静态库通常用于隐藏功能实现代码,使用者只能通过头文件调用相关接口,而无法知道其中的实现细节。同样的还有动态库(动态链接库),两者之间的主要区别在于:静态库可以编译到我们的应用程序中,应用程序可以在没有静态库的环境中运行;而动态库不能被编译到我们的应用程序中,应用程序必须在有动态库的环境下才能正常运行。

下面简单介绍下如何创建静态库。

创建工程

Xcode -> File -> New -> Project, 在弹出的工程创建选项中,选择Cocoa Touch Static Library, 填入相关信息完成静态库工程的创建。

编译静态库

这里提供两种编译生成静态库的方式,xcodebuild方式手动build方式

  • xcodebuild方式
    1. $ xcodebuild -target <iphonesimulator-lib.a> -configuration Release -sdk iphonesimulator -arch i386 -arch x86_64 // 针对模拟器运行的静态库
    2. $ xcodebuild -target <iphoneos-lib.a> -configuration Release -sdk iphoneos -arch armv7 -arch arm64// 针对真机运行的静态库
  • 手动build方式

    1. 选择iOS Simulator -> Command+B, 编译成功后,工程Projcets结构下显示的*.a文件即是编译成功的静态库文件,右键Show in Finder 找到该文件
    2. 选择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 // 针对真机运行的静态库

然后合并两个静态库。