iOS 静态库(下)

简介: iOS 静态库(下)

三、.framework 静态库的制作



  • 3.1、创建项目时, 直接选择.framework静态库



image.png


3.2、创建一个继承于NSObjectJKTest类,并写一个类方法,把该类的.h文件暴露出来

image.png


提示:记得把需要暴露的 .h 文件导入到在创建静态库的时候生成的 .h 文件里面,如上面的 JKOCProjectTool.h


image.png

3.3、利用上面2.6方案二生成发布版本的静态库,记得修改支持的最低版本,修改 把.framework的库由动态库改为静态库


image.pngimage.png

// 1.cd 进入静态库项目
cd JKOCProjectTool
// 2.使用xcodebuild生成静Release下真机的静态库
xcodebuild -target JKOCProjectTool -configuration Release -sdk iphoneos -arch armv7 -arch arm64
// 3.使用xcodebuild生成静Release下模拟器的静态库
xcodebuild -target JKOCProjectTool -configuration Release -sdk iphonesimulator -arch i386 -arch x86_64

image.png


使用xcodebuild生成静Release下模拟器的静态库


提示:你如果需要 Debug 下的静态库,参照 2.6 自行生成


  • 3.4、测试一下是否可以运行(提示:如果不把动态库改为静态库会运行报错,如果你想强行使用动态库,那么你就在:TARGETS->General->Embedded Binaries 添加你的库)
    image.png


测试OK


  • 3.5、合并 .framework 静态库


image.png


合并静态库


lipo -create 真机的JKOCProjectTools路径 模拟器的JKOCProjectTools路径 -output 合并后的JKOCProjectTools文件


切记:合成的是二进制文件而不是framework,最后合成的二进制文件替代之前的二进制文件即可


  • 3.6、补充:静态库操作
  • <1>、合成不同架构的库(也就是上面的3.5)


lipo -create xx xx -output xxx
  • <2>、分解合成库


lipo -thin 架构名称 xx -output xx
  • <3>、测试静态库 所支持的架构


cd 进入 静态库所在的文件夹
lipo -info 库文件名
  • <4>、从合成库移除某个架构


lipo -remove 架构名称 xx -output xx

提示:上面3.6中的 xx 代表静态库名


四、总结


  • 4.1、静态库打包的完整正确步骤
  • <1>、确定是静态库
  • .a 的肯定是静态库
  • .framework的需要设置链接类型,project -> Build Settings-> 搜索 Mach-o Type ; 改为静态库选择 Static Library
    image.png
    `.framework`的需要设置链接类型
  • <2>、确定支持模拟器或者真机中的所有架构


  • 如果使用的2.6类里面的 方案一 那就是xcode要支持所有的架构的模拟器,并且修改 Build Settings ->Build Active ->NO,这样编译之后,debug真机下支持debug真机下所有的架构,debug模拟器下支持debug模拟器下所有的架构


  • 如果使用的2.6类里面的 方案二xcodebuild方法就可以支持所有的架构


  • <3>、提供的静态库应该是 release版本


  • 如果使用的2.6类里面的 方案一:项目 -> Edit Scheme -> Run -> Release/Debug 分别进行编译
  • 如果使用的2.6类里面的 方案二xcodebuild方法,在命令类里面输入 Release 就好


  • 4.2、.a静态库.framework静态库的区别?
  • <1>、.a 是一个纯二进制文件,  .framework中除了有二进制文件之外还有资源文件,.bundle就是资源文件
  • <2>、.a 文件不能直接使用, 至少要有.h文件的配合; .framework 文件可以直接使用
  • <3>、.a + .h + sourceFile = .framework
  • <4>、建议使用 .framework


  • 4.3、静态库开发中的常见问题


  • 问题1: 有些第三方库会使用到一些图片素材,例如公司的logo,xib文件等,如何做?
    答:创建一个.bundle文件,创建方式看 资源文件 .buldle 的添加第十。
  • 问题2: 如果用户需要导入的头文件过多怎么加?
    答:在创建  .framework项目会默认生成一个 .h 文件,我们可以把其他的 .h 文件导入 默认生成一个.h 文件 中
  • 问题3: 静态库程序怎样测试?
    答:创建一个创建复合项目,看下面 4.4 创建的步骤


  • 4.4、创建一个创建复合项目(符合工程的名字定义为:复合项目


  • <1>、在复合项目中添加一个.framework的静态库JKTools



image.png
在复合项目中添加一个`.framework`的静态库`JKTools`

  • <2>、创建一个JKTest类,创建一个类方法,并把JKTest的.h放到创建静态库生成的.h文件里面
    image.png
    创建一个`JKTest`类,创建一个类方法
    image.png

    把JKTest的`.h`放到创建静态库生成的`.h`文件里面
  • <3>、选中JKTools,修改下面选项
    image.png
    修改JKTools支持的最低版本为9.0,看自己项目了
    image.png

    设置为静态库
    image.png

    修改 Build Settings ->Build Active ->NO,这样编译之后,debug真机下支持debug真机下所有的架构,debug模拟器下支持debug模拟器下所有的架构
    image.png

    把需要暴露的文件放到Public里面
  • <4>、在复合项目添加我们的静态库依赖

    image.png
    在符合项目添加我们的静态库依赖
  • <5>、测试
    导入#import <JKTools/JKTools.h>,调用下面的方法


[JKTest jk_test];
  • 打印结果:


复合项目的测试
  • <6>、有关 .framework的文件导出,我就不再重复了,也就是上面2.6的步骤,有关合上面也有讲述


五、将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换



  • 5.1、应用场景
    你找到一个功能是ARC项目下的,你想用,里面有很多的类,你怎么把他们搬到ARC项目下使用???


  • 5.2、解决方案一(适用于类不太的情况)
  • <1>、我们模拟一个类JKTools,它是MRC下的项目

    image.png
    我们模拟一个类JKTools,它是MRC下的项目
  • <2>、我们把JKTools的.h与.m拖到ARC的工程下,报错是肯定的,我们看下如何处理。如下图
    image.png

    在ARC图中路径找到MRC下的.m文件,双击输入-fno-objc-arc

提示:在ARC图中路径找到MRC下的.m文件,双击输入-fno-objc-arc,再运行就不会报错了


  • 5.3、解决方案二(适用于MRC的类很多的情况):把MRC下的类打包成静态库,.a 或者 .framework 都可以,下面以打包成.framework为例,步骤如下
  • <1>、创建一个.framework项目,这里名字一JKTools为例,把上面JKTools.hJKTools.m拖进去,把并修改项目为 MRC
    image.png
    修改项目为MRC

    TARGETS->Build Settings下搜 Automatic Reference ,改为 NO;其中YES为ARC,NO为MRC。
  • <2>、重复 4.4 里面 <3> 的步骤
  • <3>、生成发布版本的静态库以及合并真机与模拟器的二进制文件,最后把合并的二进制文件替换掉 真机下framework里面的二进制文件
  • <4>、把framework拖入 ARC的项目,直接导入framework里面的.h文件查看是否可以,经过测试时OK的,不懂的你可以联系我


五、Swift打包动态库



  • 5.1、创建一个Swift 下的 .framework 工程,命名为 JKTools ,同时创建一个类JKTest,写一个方法 jk_test
    image.png
    创建一个`Swift` 下的 `.framework` 工程,命名为 `JKTools` ,同时创建一个类`JKTest`,写一个方法 `jk_test`
  • 5.2、把支持的最低版本调为 9.0,具体的看自己项目

    image.png
    把支持的最低版本调为 9.0,具体的看自己项目
  • 5.3、修改 Build Settings ->Build Active ->NO,这样编译之后,debug真机下支持debug真机下所有的架构,debug模拟器下支持debug模拟器下所有的架构
  • 5.4、修改 为静态库
    image.png

    修改 为静态库
  • 5.5、在release下编译模拟器与真机,生成像一个的.framework 文件,把类里面的二进制文件合并成一个,步骤和上面一样,不再重复了
  • 5.6、测试静态库的使用,结果显示是OK的
    image.png

    测试静态库的使用,结果显示是OK的


到此,静态库的相关知识记录到这,相比较其他的博客还是比较详细的。遇到任何问题都可以再我的个人信息里面来联系我

目录
相关文章
|
5月前
|
iOS开发
iOS使用.framework类型的静态库
iOS使用.framework类型的静态库
39 1
|
5月前
|
开发工具 iOS开发
iOS制作.framework静态库
iOS制作.framework静态库
44 1
|
5月前
|
iOS开发 Perl
iOS使用.a类型的静态库
iOS使用.a类型的静态库
39 1
|
5月前
|
开发工具 iOS开发
iOS制作.a类型的静态库
iOS制作.a类型的静态库
36 1
|
5月前
|
开发工具 iOS开发 Perl
iOS使用SDK静态库
iOS使用SDK静态库
51 0
|
5月前
|
XML JSON API
IOS网络编程:介绍一下 Alamofire 库。
IOS网络编程:介绍一下 Alamofire 库。
116 3
|
12月前
|
安全 物联网 API
iOS开源库总结
iOS开源库总结
42 0
|
前端开发 API Android开发
Android侧滑踩坑记(仿IOS侧滑finish页面基于Slidr库)
Android侧滑踩坑记(仿IOS侧滑finish页面基于Slidr库)
258 0
|
Web App开发 存储 网络协议
ios 组件化之Cocoapods私有库详解以及问题解决方案
ios 组件化之Cocoapods私有库详解以及问题解决方案
ios 组件化之Cocoapods私有库详解以及问题解决方案
|
开发工具 iOS开发 Perl
iOS开发 - undefined symbols for architecture x86_64,大多数都是缺少静态库,缺少静态库分下面几种
iOS开发 - undefined symbols for architecture x86_64,大多数都是缺少静态库,缺少静态库分下面几种
174 0
iOS开发 - undefined symbols for architecture x86_64,大多数都是缺少静态库,缺少静态库分下面几种