iOS-静态库,动态库,framework浅析

Posted 梁飞宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS-静态库,动态库,framework浅析相关的知识,希望对你有一定的参考价值。

创建.a静态库

第一步,新建工程。
     一般使用工程名就使用库的名称,比如我这里用FMDB来创建静态库,我的工程名就取名为FMDB,创建的.a静态库就是libFMDB.a。

                    技术分享
使用静态库模板新建工程.png
技术分享
创建的工程.png

第二步,删除系统默认创建的【FMDB.h】和【FMDB.m】文件,导入需要打包的源文件。

技术分享
导入源文件后.png


第三步(方式一),修改项目配置

技术分享
修改配置.png

点击上图中的【3】,弹出的列表中选择【New Headers Phase】,打开【Headers (0 items)】,点击左下角的【+】,选择所有的.h文件。

技术分享
配置需要暴漏的文件的.h头.png

第三步(方式二),修改项目配置

技术分享
修改项目配置.png

第四步,修改导出product配置

技术分享
修改编译配置.png

第五步,修改编译指令集

技术分享
设置Release为NO.png

模拟器:iPhone4s~5 : i386 iPhone5s~6plus : x86_64
真机:iPhone3gs~4s : armv7 iPhone5~5c : armv7s iPhone5s~6plus : arm64
如果第五步这里,设置为YES,那么编译出来的.a静态库就只包含当前设备的指令集。
举个例子:如果我们选择iPhone 5模拟器【Command+B】编译,则编译出来的.a静态库只能用iPhone4s~5模拟器跑程序,用iPhone5s~6plus,则会报找不到x86_64的libFMDB库。
设置为NO,则会把所有指令集的都打包合并。

第六步,编译(快捷键【Command+B】

    编译时,需要用模拟器和真机各编译一次,这样Products目录下的libFMDB.a静态库才会变为黑色,右键show in Finder,可以进入Products目录下。

技术分享
编译结果.png

为什么需要用模拟器和真机各编译一次呢?
     可以看到Products目录下有【Release-iphoneos】和【Release-iphonesimulator】两个文件件。前者里面是真机使用的.a静态库,后者是模拟器使用的.a静态库。

注意:如果步骤四中,不将Build Configuration改为Release,则打包出来的静态库会存于【Debug-iphoneos】和【Debug-iphonesimulator】两个文件夹下。
我们一般都使用Release模式,因为程序最终发布之后是Release版的,所以静态库也是在Release模式下使用。

如果想要通用需要将模拟器使用的静态库与真机使用的静态库合并成一个静态库,可以使用终端命令来实现。命令格式:

lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径。

本文中使用的命令如下:

lipo -create /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-ctegiztcjikewoeprxxtmryzetfa/Build/
Products/Release-iphoneos/libFMDB.a
             /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-ctegiztcjikewoeprxxtmryzetfa/Build/
Products/Release-iphonesimulator/libFMDB.a
-output      /Users/harvey/Desktop/libFMDB.a

补充
    经过多次实践,第三步的操作省略,依然可以导出可正常使用的包。
如果静态库中有category类,则在使用静态库的项目配置中【Other Linker Flags】需要添加参数【-ObjC]或者【-all_load】。






















以上是关于iOS-静态库,动态库,framework浅析的主要内容,如果未能解决你的问题,请参考以下文章

IOS 静态库的和.framework制作

iOS静态库 .a 和framework超详细

iOS库--.a与.framework

iOS静态库和Framework区别

iOS库 .a与.framework区别

IOS 静态库 和 动态库