iOS平台静态库的打包和调用
在iOS平台为了实现源代码保护,可以将具体实现细节打包为静态库.a
文件,同时暴露.h
文件方便业务代码调用。制作静态库的过程如下:
制作并打包静态库.a
文件
- 新建工程
new
->project
,选择iOS
tab,Framework & Library
分类下的Cocoa Touch Static Library
,如图:
-
下一步
next
,输入静态库名称MyStaticLib
等信息,Language
暂时选择Objective-C
。
- 生成项目工程,会看到生成了
MyStaticLib.h
和MyStaticLib.m
两个文件,Products
目录下的静态库文件libMyStaticLib
尚未生成。
-
静态库文件的代码既支持
Objective-C
、Swift
,也支持原生的C
语言。这里使用C
作为示例语言编写一个简单的逻辑。将MyStaticLib.h
改造为C
代码,引入标准C函数库
,并在其中定义一个方法sum
,它接受两个int
类型的参数,返回它们的和
。#ifndef MyStaticLib_h #define MyStaticLib_h #include <stdio.h> #include <stdlib.h> #include <string.h> int sum(int a, int b); #endif /* MyStaticLib_h */
-
在
MyStaticLib.m
文件中添加sum
方法的具体实现:#import "MyStaticLib.h" int sum(int a, int b) { return a + b; }
- 示例代码的逻辑很简单,现在可以配置工程的一些属性了。在
Build Phases
页面,Copy Files
选项中已经自动为我们添加了暴露给外部调用的头文件MyStaticLib.h
。
切换至Build Settings
页面,注意选项Build Active Architecture Only
,通常Debug
选择YES
,而Release
选择NO
。如果是YES
,代表静态库只针对当前设备的架构打包,即只针对图中设备模拟器iPhone XR
的架构x86_64
进行打包。
- 运行程序,在
Products
目录下生成了静态库文件libMyStaticLib.a
,查看目录可以发现同时暴露了MyStaticLib.h
头文件。至此,静态库.a
文件已经制作完成。
测试调用静态库
-
新建一个简单的
Single View App
,在工程目录下新建文件夹3rd
,并将之前生成的libMyStaticLib.a
和头文件MyStaticLib.h
拖入3rd
文件夹下,注意选中Copy items if needed
。检查General
页面下选项Linked Frameworkd and Libraries
中是否自动识别并添加了libMyStaticLib.a
。如果没有,需要点击+
添加。
- 切换至
Build Settings
页面,找到选项Header Search Paths
,输入../3rd
,并设置为recursive
递归的方式寻找。Xcode
会在配置的目录下寻找头文件。
-
编辑源文件
ViewController.m
如下,引入头文件MyStaticLib.h
,添加测试代码#import "ViewController.h" #import "MyStaticLib.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 测试代码 int result = sum(5, 10); NSLog(@"%d", result); } @end
-
运行程序,可以在控制台看到输入了正确的值
15
。至此,静态库的调用实现完成。
依照不同的CPU架构打包
-
模拟器架构为
x86_64
,真机架构为armv7
、armv7s
、arm64
-
之前打包时,我们选择的设备是模拟器
iPhone XR
,因此生成的静态库libMyStaticLib.a
支持的架构是x86_64
,真机是无法运行的。可以通过命令lipo -info libMyStaticLib.a
查看:lipo -info libMyStaticLib.a
输出结果为
libMyStaticLib.a is architecture: x86_64
。 -
要想在真机上运行,打包时必须选择对应的设备架构。注意:依照不同架构生成静态库文件的大小也是不同的。 切换至
Build Settings
页面,配置选项Architectures
和Valid Architectures
,具体配置如下:armv7
armv7s
-
arm64
-
通用