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 ...
随机推荐
- 前端框架 EasyUI (1)熟悉一下EasyUI
jQuery EasyUI 官方网站 http://www.jeasyui.com/ .去年新开了个中文网 http://www.jeasyui.net/,不知道是不是官方的,不过看着挺像样.但是,广 ...
- Android Ormlite 学习笔记2 -- 主外键关系
以上一篇为例子,进行主外键的查询 定义Users.java 和 Role.java Users -- Role 关系为:1对1 即父表关系 Role -- Users 关系为:1对多 即子表关系 下面 ...
- 安卓易学,爬坑不易——腾讯老司机的RecyclerView局部刷新爬坑之路
针对手游的性能优化,腾讯WeTest平台的Cube工具提供了基本所有相关指标的检测,为手游进行最高效和准确的测试服务,不断改善玩家的体验.目前功能还在免费开放中. 点击地址:http://wetest ...
- 写出易调试的SQL
h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...
- PHP获取上个月最后一天的一个容易忽略的问题
正常来说,PHP是有一个很方便的函数可以获取上个月时间的 strtotime (PHP 4, PHP 5, PHP 7) strtotime - 将任何英文文本的日期时间描述解析为 Unix 时间戳 ...
- python 入门笔记
1.pip包安装 pip install *** pip 中http和https代理设置(/etc/profile) 2.强制保存 :w !sudo tee % 3.cffi是python调用C的包 ...
- PAT甲级 1001. A+B Format (20)
题目原文: Calculate a + b and output the sum in standard format -- that is, the digits must be separated ...
- 图解CSS3制作圆环形进度条的实例教程
圆环形进度条制作的基本思想还是画出基本的弧线图形,然后CSS3中我们可以控制其旋转来串联基本图形,制造出部分消失的效果,下面就来带大家学习图解CSS3制作圆环形进度条的实例教程 首先,当有人说你能不能 ...
- Android 关于ijkplayer
基于ijkplayer封装支持简单界面UI定制的视频播放器 可以解析ts格式的so库 怎样编译出可以解析ts等格式的so库?就是编译的时候需要在哪一步修改配置? 一些电视台的m3u8 CCTV1综合, ...
- ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id
出现场景:当点击"分类"再返回"首页"时,发生error退出 BUG描述:Caused by: java.lang.IllegalArgumentExcep ...