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:

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静态库"的制作及使用篇的更多相关文章

  1. 如何在IOS开发中在自己的framework中添加.bunble文件

    今天就跟大家介绍一下有关,如何在IOS开发中在自己的framework中添加.bunble文件,该文章我已经在IOS教程网(http://ios.662p.com)发布过来,个人觉得还是对大家有帮助的 ...

  2. 汇总iOS开发中需要用到的开源库

    来源:http://mobile.51cto.com/hot-431256.htm 1.iOS &iPhone 网络异步加载 asi-http-request [1-1 ASI HTTP 下载 ...

  3. iOS开发中使用静态库 .a 文件

    ​​iOS开发中,在使用一些第三方库时,可能是一个静态库(比如GPUImage).这种情况下,需要编译出静态库文件(.a) ,然后配合响应的头文件(.h 文件)使用. 编译静态库,直接在Xcode中编 ...

  4. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  5. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  6. iOS:Xcode7下创建 .a静态库 和 .framework静态库

    Xcode7 中创建静态库:.a 和 .framework 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开 ...

  7. 在iOS开发中,给项目添加新的.framework

    首先需要了解一下iOS中静态库和动态库.framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我 ...

  8. iOS开发中与库相关的术语

    动态库 VS 静态库 Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime

  9. iOS开发中遇到的一些问题及解决方案【转载】

    iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // //  MyScrollView.m //  Creat ...

随机推荐

  1. Android指纹解锁

    Android6.0及以上系统支持指纹识别解锁功能:项目中用到,特此抽离出来,备忘. 功能是这样的:在用户将app切换到后台运行(超过一定的时长,比方说30秒),再进入程序中的时候就会弹出指纹识别的界 ...

  2. 首个threejs项目-前端填坑指南

    第一次使用threejs到实际项目中,开始的时候心情有点小激动,毕竟是第一次嘛,然而做着做着就感受到这玩意水好深,满满的都是坑,填都填不过来.经过老板20天惨无人道的摧残,终于小有成就. 因为第一次搞 ...

  3. POCO Controller 你这么厉害,ASP.NET vNext 知道吗?

    写在前面 阅读目录: POCO 是什么? 为什么会有 POJO? POJO 的意义 POJO 与 PO.VO 的区别 POJO 的扩展 POCO VS DTO Controller 是什么? 关于 P ...

  4. Socket聊天程序——Common

    写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...

  5. Python列表去重

    标题有语病,其实是这样的: 假设有两个列表 : L1 = [1,2,3,4] ; L2 = [1,2,5,6] 然后去掉L1中包含的L2的元素 直接这样当然是不行的: def removeExists ...

  6. 解决PHP-问题:Class 'SimpleXMLElement' not found in

    1.问题 在ubuntu 16.10中,学习PHP,学习到PHP如何生成XML文件时候,碰到了这个问题: PHP Fatal error: Class 'ClassName\SimpleXMLElem ...

  7. Python自然语言处理工具小结

    Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...

  8. Asp.net Core准备工作

    1.安装环境 安装.Net Core SDK 安装VS2015 Update3 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2.exe 2.新建Core工程 项 ...

  9. QT内省机制、自定义Model、数据库

    本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...

  10. 手机web如何实现多平台分享

    话说App一般都带有分享到社交平台的入口,web网页的分享也有很不错的框架,但是随着HTML5的不断发展,手机web页面越来越多的进入到我们的生活中,那如何在我们的手机上完成分享呢?话说各大分享平台都 ...