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 ...
随机推荐
- MIP 官方发布 v1稳定版本
近期,MIP官方发布了MIP系列文件的全新v1版本,我们建议大家尽快完成升级. 一. 我是开发者,如何升级版本? 对于MIP页面开发者来说,只需替换线上引用的MIP文件为v1版本,就可以完成升级.所有 ...
- 当忘记mysql数据库密码时如何进行修改
因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...
- runtime梳理。
一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于 ...
- Mac OS、Ubuntu 安装及使用 Consul
Consul 概念(摘录): Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb 的 SmartStac ...
- html5 与视频
1.视频支持格式. 有3种视频格式被浏览器广泛支持:.ogg,.mp4,.webm. Theora+Vorbis=.ogg (Theora:视频编码器,Vorbis:音频编码器) H.264+$$$ ...
- git-2.10.2-64-bit介绍&&git下载&&git安装教程
Git介绍 分布式:Git系统是一个分布式的系统,是用来保存工程源代码历史状态的命令行工具. 保存点:Git的保存点可以追踪源码中的文件, 并能得到某一个时间点上的整个工程项目的状态:可以在该保存点将 ...
- vue.js初探
前言 入手2016最火前端框架之一vue.js.大概从网上找了些资料看了下vue.js,从网上的资料来看只能惊叹其发展速度太快,让我意外的是其作者是华人的前提下作品这么受欢迎. 网上的博客和教程各种组 ...
- 如何用Java类配置Spring MVC(不通过web.xml和XML方式)
DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...
- 面向对象相关知识点xmind
- BPM合同管理解决方案分享
一.方案概述合同是组织与组织间所订协议的法律 表现形式,体现着双方对于合作在法律和道德上的承诺.然而,大多数企业的合同管理都或多或少存在合同审批过程不规范.签订草率.审批权责不清.合同执行跟踪难.合同 ...