iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇
- .framework静态库支持OC和swift
.a静态库如何制作可参照上一篇: iOS开发中静态库之".a静态库"的制作及使用篇
一.OC创建.framework静态库
1.创建工程,语言选择OC
2.进入工程后,会自动帮我们创建一个.h文件,主头文件,和我们项目名称一般完全一致.不要删除了!
3.编写核心代码
- 依旧使用简单示例,MathTools
MathTools.h文件
@interface MathTools : NSObject
+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;
@end
MathTools.m文件
@implementation MathTools
+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2
{
return num1 + num2;
}
@end
4.制作.framework静态库
cmd + B 编译一下- 我们就会发现在Products文件下面有个实体的.framework文件
- 右键
Show In Finder - 发现文件夹内有个.h头文件,但它是主头文件,并不是我们想暴露出去的头文件,我们想暴露的头文件是MathTools.h
- 来到项目配置,把MathTools.h文件暴露出去

- 把MathTools.h拖到Public之后,cmd + B编译一下
Show In Finder,发现Headers文件夹内有两个.h文件了,我们要暴露的.h文件也在内- 大家可能还会发现一个exec的文件,它其实就是我们的.m文件被编译之后的二进制文件
5.测试.framework静态库,先使用OC创建测试工程
将我们制作好的.framework静态库拖入测试的工程项目中
假如我们用OC创建的测试工程
在ViewController中执行touchBegan方法,点击控制器获取结果
- 在ViewController.m文件中导入静态库的主头文件
#import <MTYMathToolsOC/MTYMathToolsOC.h> - 但是我们这时在方法里是拿不到我们静态库中的方法实现的,因为我们并没有在上面的主头文件中导入MathTools.h头文件.
- 导入MathTools.h头文件,执行touchBegan方法,cmd + R运行程序
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSLog(@"%ld",[MathTools sumNum1:30 num2:40]);
}- 发现程序崩溃了
// 动态库不能被加载
dyld: Library not loaded:
- 在ViewController.m文件中导入静态库的主头文件
5.1.Bug1解决 - dyld: Library not loaded:
- 我们默认情况下编译出来的.framework库是一个动态库
- 点击工程 -> General 我们发现,系统在我们编译时默认给我们添加了一个库,在Linked Frameworks and Libraries位置
- 但是动态库不是在这里添加,在上面的
Embedded Binaries处添加

- 这时在下面仍旧会为我们默认添加这个库,但是这回不要把它删了,运行
- 这时我们的静态库就可以被使用了
5.2.虽然上面.framework静态库可以被使用,但是它是个动态库,一般开发中我们用的都是静态库
5.3.如何将我们编译.framework改成静态库?
- 点击工程 -> BuildSetting -> 搜索mach -> 改成Static Library

- 配置好后,重新编译一下,然后将新的.framework文件拖入测试工程内,编译(别忘了在静态库的主头文件内导入MathTools.h文件)
5.4.但是仍旧存在一个CPU架构支持的问题
这个问题上篇.a静态库中有提及
上面是选择的iPhone 7模拟器,在iPhone 5及真机上仍旧会报错
如何解决?(其实步骤同上篇.a的bug解决步骤几乎一样)
- 仍旧是终端输入lipo -info来检测
- 发现支持x86_64
- 注意: 这里不能直接lipo -info我们的静态库文件,因为它本质和文件夹的作用是一样的,要lipo -info它里面的MTYMathToolsOC这个exec文件.
两种方法解决?
- 方法1:直接项目配置: 项目 -> Build Setting -> Build Active Architecture Only -> Debug 改为No(上篇文章有配图)
- 方法2:弄两个.framework文件,终端create合并(同.a文件的操作方法)
但是真机仍旧报错
- 把.framework静态库选择真机编译一下
- 终端执行create命令合并成一个MTYMathToolsOC的exec文件,这个文件名必须一致,不能乱写
- 合并之后查看新的静态库支持的CPU架构
Architectures in the fat file: MTYMathToolsOC are: i386 x86_64 armv7 arm64
- 把MTYMathToolsOC文件拷贝到原来的库文件中,替换掉原来的exec文件
- 就可以使用了
6.使用swift来创建测试工程,看静态库是否可用
- 创建swift工程
- 导入我们制作好的静态库文件到项目中
- 在ViewController.swift中,导入库的头文件,这里我们可以直接敲出来
import MathToolsOC
- 那么在touchBegan方法中能否敲出方法名呢,试验一下发现并不能.
- 在swift中,导入库的头文件其实就是导入框架的主头文件MathToolsOC.h,然而我们之前在MathToolsOC.h中并没有把MathTools.h导入其中
- 所以把MathTools.h导入其中
- 运行报错,因为我们并没有配置动态库那个步骤
错误信息
// 动态库未加载
dyld: Library not loaded
配置过后就会发现,在swift中测试也没有问题
注意点
1.为什么这次没有把动态库转为静态库?
因为swift中是不支持静态库的,所以转换的话,会报错
2.动态库转静态库的方法见上面
二.用swift来创建.framework库
其实步骤和前面差不多,最初创建时都会遇到这几个问题?
- .framework默认创建出来是动态库,要在General下面进行配置,在Embeded Binaries添加动态库
- CPU支持的架构问题.这个同前面方法一样,终端最后合并一下就好
由于步骤相差不大,这里就不再赘述了,但除了上面的bug还有有几个注意点
- swift中不支持静态库,就是说以前我们创建的.framework库默认是动态库,最后要转为静态库使用,这在OC中可以,但在swift中不可以,如果这里把动态库转为静态库的话,那么就会报错
- swift创建静态库的时候, 类及类方法前面加上public,以便外界可以调用
iOS开发中静态库之".framework静态库"的制作及使用篇的更多相关文章
- 如何在IOS开发中在自己的framework中添加.bunble文件
今天就跟大家介绍一下有关,如何在IOS开发中在自己的framework中添加.bunble文件,该文章我已经在IOS教程网(http://ios.662p.com)发布过来,个人觉得还是对大家有帮助的 ...
- 汇总iOS开发中需要用到的开源库
来源:http://mobile.51cto.com/hot-431256.htm 1.iOS &iPhone 网络异步加载 asi-http-request [1-1 ASI HTTP 下载 ...
- iOS开发中使用静态库 .a 文件
iOS开发中,在使用一些第三方库时,可能是一个静态库(比如GPUImage).这种情况下,需要编译出静态库文件(.a) ,然后配合响应的头文件(.h 文件)使用. 编译静态库,直接在Xcode中编 ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- iOS:Xcode7下创建 .a静态库 和 .framework静态库
Xcode7 中创建静态库:.a 和 .framework 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开 ...
- 在iOS开发中,给项目添加新的.framework
首先需要了解一下iOS中静态库和动态库.framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我 ...
- iOS开发中与库相关的术语
动态库 VS 静态库 Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime
- iOS开发中遇到的一些问题及解决方案【转载】
iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // // MyScrollView.m // Creat ...
随机推荐
- C++对C的函数拓展
一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...
- 玩转spring boot——快速开始
开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...
- bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序
也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...
- Js 原型和原型链
Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...
- Android注解使用之注解编译android-apt如何切换到annotationProcessor
前言: 自从EventBus 3.x发布之后其通过注解预编译的方式解决了之前通过反射机制所引起的性能效率问题,其中注解预编译所采用的的就是android-apt的方式,不过最近Apt工具的作者宣布了不 ...
- [C#] 简单的 Helper 封装 -- RandomHelper
using System; namespace Wen.Helpers { /// <summary> /// 随机数助手 /// </summary> public seal ...
- CSS垂直居中的11种实现方式
今天是邓呆呆球衣退役的日子,在这个颇具纪念意义的日子里我写下自己的第一篇博客,还望前辈们多多提携,多多指教! 接下来,就进入正文,来说说关于垂直居中的事.(以下这11种垂直居中的实现方式均为笔者在日常 ...
- angular 源码分析 1 - angularInit()
angularjs 是个神奇的框架,由于我的好奇,想了解她的内部工作原理,只能一步一步的走进她,靠近她,和她深入的交流. angularjs 的入口是什么样子的呢?一起掀起她的盖头吧. 在这里我只讲方 ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- Spring中Bean的实例化
Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...