iOS静态库和动态库的创建和使用

iOS静态库和动态库的创建和使用

920 发布: 2020/2/15 02:10 本文总阅读量

关于iOS动态库和静态库的使用优缺点已在上篇中说过了,我们自定义的库为cocoaTouchFrameWork,本篇就来记录下库的创建和简单的使用。

静态库的创建和使用:

1.创建cocoaTouchFrameWork项目: 项目1

打开Xcode选择新建项目 > 选择创建的类型为上图中的CocoaTouchFrameWork类型。

2.本例中sdk库名为LMSDK,项目创建完成后,在LMSDK目录中创建功能实现类Calculator,目录如下: 项目2

LMSDK.h为我们静态库自动生成的公开头文件,我们需要公开的功能头文件(本例中功能实现类为Calculator)都可以导入到此头文件中,以便在使用时只需import LMSDK.h就可以了。如下图所示: 项目3

3.导入功能实现类之后我们开始在功能类中实现功能的实现方法,本例中为简单的加法运算,并将要暴露的方法在.h文件中声明 项目4 项目5

4.功能实现完成之后,我们开始设置库的属性,首先设置库的打包类型为静态库: 项目6

选择当前库的Target > 选择BuildSettings > 选择Mach-O TypeStaticLibrary(表示项目打包为静态库)

5.设置我们要暴露的头文件目录 项目7

选择项目的BuildPhases中的Headers,将我们要暴露的头文件添加在此目录下,如果不添加,外部是无法导入该头文件的。

6.设置完成之后我们就可以开始打包了,注意!打包会有两个版本,一个是真机上可以用的版本,一个是模拟器上用的版本。要怎么操作呢?很简单,我们分别选择真机和模拟器,然后command + B 各编译一次;编译完成之后我们选择项目目录下的product目录,就可以看到我们的LMSDK.FrameWork; 项目8

7.选中LMSDK.FrameWork后分别在真机和模拟器的模式下选择showInFinder,找到真机和模拟器对应的FrameWork,目录如下: 项目9

iphoneos为真机生成的库目录;simulator为模拟器生成的库目录。

8.接下来就是将两个库合并为一个通用库,这里我们使用终端的lipo命令行来手动打包。操作如下:首先我们如上图所示分别找到真机和模拟器目录下的sdk签名文件(LMSDK),然后打开终端,输入以下命令: lipo -create (这里分别拖入两个目录下的签名文件路径) -output Desktop/mySDK

lipo -create 命令为创建一个文件; -output 为输出命令;Desktop/mySDK 为输出的路径和文件名(此处为输出到桌面,文件名为mySDK)

9.最后一步将生成的新的签名文件mySDK改名为和库名相同(本例中为LMSDK),然后拷贝到之前生成的带有_CodeSignature 文件夹的frameWork库的根目录下替换掉原来的库的签名文件。至此该frameWork就是我们最终生成的通用版frameWork库。

注意:如果生成的签名文件名称和库名不同的话,再使用时将会编译报错,找不到该库: library not found for…;如果在使用库时发现在模拟器下可以运行,但是真机运行时报错:ld: symbol(s) not found for architecture armv7 或者arm64 等错误时,说明通用签名文件没有合并正确;再次重申合并成的新签名文件一定要和库名相同并替换掉原来的签名文件!!切记!!

静态库的使用:

1.创建测试项目,导入静态库: 项目10

在将静态库拖进测试项目时,记得勾选上图中的Copy Items if needed选项。

2.设置静态库的引用路径: 项目11

Target > BuildSetting > Library Search Paths 中添加静态库的引用路径

3.在使用库的地方导入头文件: 项目12

4.在需要使用库功能的地方调用库中实现类的功能方法: 项目13

至此整个静态库的创建和使用流程就完成了。

动态库的创建和使用:

动态库(这里指frameWork库)的创建过程和静态库的创建过程几乎一模一样,除了在第2步设置库的打包类型时要选择动态类型;如下图所示: 项目14

其他步骤可参考以上静态库的创建过程。

动态库的使用:

动态库的使用和静态库的使用相比要多一步,除了和静态库一样导入库,设置搜索路径之外,还需要以下的设置步骤,需要在Target > General > Embedded Binaries项目下添加导入的动态库: 项目15

如果不添加General > Embedded Binaries目录的话会报以下错误:

dyld: Library not loaded: @rpath Referenced from:
Reason: no suitable image found. Did find:

参考