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. MIP 官方发布 v1稳定版本

    近期,MIP官方发布了MIP系列文件的全新v1版本,我们建议大家尽快完成升级. 一. 我是开发者,如何升级版本? 对于MIP页面开发者来说,只需替换线上引用的MIP文件为v1版本,就可以完成升级.所有 ...

  2. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

  3. runtime梳理。

    一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于 ...

  4. Mac OS、Ubuntu 安装及使用 Consul

    Consul 概念(摘录): Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb 的 SmartStac ...

  5. html5 与视频

    1.视频支持格式. 有3种视频格式被浏览器广泛支持:.ogg,.mp4,.webm. Theora+Vorbis=.ogg  (Theora:视频编码器,Vorbis:音频编码器) H.264+$$$ ...

  6. git-2.10.2-64-bit介绍&&git下载&&git安装教程

    Git介绍 分布式:Git系统是一个分布式的系统,是用来保存工程源代码历史状态的命令行工具. 保存点:Git的保存点可以追踪源码中的文件, 并能得到某一个时间点上的整个工程项目的状态:可以在该保存点将 ...

  7. vue.js初探

    前言 入手2016最火前端框架之一vue.js.大概从网上找了些资料看了下vue.js,从网上的资料来看只能惊叹其发展速度太快,让我意外的是其作者是华人的前提下作品这么受欢迎. 网上的博客和教程各种组 ...

  8. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...

  9. 面向对象相关知识点xmind

  10. BPM合同管理解决方案分享

    一.方案概述合同是组织与组织间所订协议的法律 表现形式,体现着双方对于合作在法律和道德上的承诺.然而,大多数企业的合同管理都或多或少存在合同审批过程不规范.签订草率.审批权责不清.合同执行跟踪难.合同 ...