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. 01.SQLServer性能优化之---水平分库扩展

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 第一次引入文件组的概念:http://www.cnblogs.com/dunitian/ ...

  2. UWP 律师查询 MVVM

    APP简介 律师查询是基于聚合数据的律师查询接口做的,这个接口目前处于停用状态,但是,由于我是之前申请的,所以,还可以用,应该是无法再申请了. 效果图 开发 一.HttpHelper 既然是请求接口的 ...

  3. 阿里云直播 C# SDK 如何使用

    阿里云直播SDK的坑 1.直播云没有单独的SDK,直播部分被封装在CDN的相关SDK当中. 2.针对SDK,没有相关Demo. 3.针对SDK,没有相关的文档说明. 4.针对SDK的说明,官网上的说明 ...

  4. System.FormatException: GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。

    在NHibernate数据库查询中出现了这个错误,由于是数据库是mysql的,当定义的字段为char(36)的时候就会出现这个错误. [解决方法] 将char(36) 改成varchar(40)就行了 ...

  5. 安装eclipse的maven插件

    我们团队用maven来管理项目需要的库文件,其实以前都没听过maven,第一次接触这个,师兄要我直接去装下这个,开始以为还挺简单的,没想到中间遇到了一些小麻烦,现在把我成功安装maven的过程分享下, ...

  6. Android带加减的edittext

    看了网上这样自带加减的edittext写得好复杂,还有各种监听事件,我觉得没有必有.于是我自己写了一个. 我这个edittext仅仅限制整数,每次加减1. public class TestEditT ...

  7. Create a Team in RHEL7

    SOLUTION VERIFIED September 13 2016 KB2620131 Environment Red Hat Enterprise Linux 7 NetworkManager ...

  8. 2Sum

    用哈希表(unordered_map)使得时间复杂度从O(n*n)降到O(n),空间复杂度从O(1)增到O(n):一边找一边插入哈希表 注意 在C++11以前要使用unordered_map需要 #i ...

  9. 【工具使用】mac电脑使用技巧

    本文地址 分享提纲: 1.  mac命令行和finder的交互 2. 一些mac的插件 3. 一些开发的配置 1.mac命令行和findder交互           1)命令行中打开当前文件夹: o ...

  10. 微信小程序体验(1):携程酒店机票火车票

    在 12 月 28 日微信公开课上,张小龙对微信小程序的形态进行了阐释,小程序有四个特定:无需安装.触手可及.用完即走.无需卸载. 由于携程这种订酒店.火车票和机票等工具性质非常强的服务,非常符合张小 ...