iOS 静态库的制作
按照公司的想法 要开发一款SDK,于是就抽空学习一下静态枯的制作过程.
在IOS中有静态库和动态库的区分,下面我们就来详细介绍一下.
一.静态库和动态库的详细介绍.
我们平时的工程中或多或少都要引入第三方的SDK,至少引用过系统的framework。其实这些SDK和Framework都属于库,库又分为静态库和动态库。我们平时导入的第三方SDK有的事Framework,有的是 .a。到底哪些是动态库,那些是静态库呢。下面我们分别介绍静态库,动态库,Framework和.a以及.tbd的区别。
二.静态库和动态库
首先解释一下什么是库,库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况会用到库:
<1>.某些代码需要提供给别人用,但是不希望别人看到我们的源码,就需要一库的形式进行封装。只暴漏出头文件。
<2>.对于某些不会进行大的改动的代码,比方说很多大公司常用且很少改变的模块都会编译成库。这样做的好处一是可以节省编译时间,二来是对于代码的管理也非常方便。
因为库是已经编译好的二进制文件了,编译的时候只需要link一下,既然提到了link那就有不同的形式了,静态和动态,与之对应的就是静态库和动态库。
1.静态库
平时我们使用到的第三方SDK基本上都是静态库,静态库有几个特点:
<1>在App编译的时候,会拷贝一份编译到目标程序中,相当于将静态库嵌入了,所以得到的App二进制文件会变大.
<2>在使用的时候,需要手动的导入静态库所依赖的其他类库。(比如说某个SDK中使用到了CoreMotion.framework,在使用的时候,需要手动导入.)有的SDK需要Link是几个系统库,只能一个一个的手动加或者使用第三方库管理工具。这也是静态库的一个很大的不方便之处)
<3>导入静态库的应用可以减少对外界的依赖,如果导入的是第三方动态库,动态库找不到的话应用就会崩掉 。
<4>静态库很大的一个优点就是减少耦合性,因为静态库中是不可以包含其他静态库的,使用的时候需要另外导入他的依赖库,最大限度的保证了每一个静态库都是独立的。
2.动态库
这是我们最常用的一类库,使用频率最高的UIKit.framework和Fundation.framework 都属于动态库,所有.dylib和.tbd结尾的都属于动态库,动态库的几个特点:
<1>.平时使用的系统库都放在iOS的系统中,在你打包应用程序的时候这些库不会拷贝到你的程序中,当需要的时候会动态的从iOS系统中加载他们,因为这个原因,动态库也被称为共享库,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码.
<2>.这些库是所有的应用公用的,换一种说法就是节省了应用安装包的体积,这是区别静态库的一个很重要的特点,因为静态库使用一次就拷贝一次,非常的浪费资源.
<3>.动态库在使用的时候不需要再次link依赖库,即导即用。唯一需要注意的就是在导入自己制作的动态库是,需要在Embedded Binaries中导入,不然会报错:image not found。此时这个动态库会跟静态库一样被拷贝到目标程序中进行编译苹果又把这种Framework叫做Embedded Framework
关于动态库要搞清楚一点,我们自己制作的动态库与系统动态库的区别,我们自己制作的动态库引入App项目的时候需要embed进项目,也就是要拷贝到目标程序中,这就有点不像动态库的特性了,苹果这么做也是考虑安全问题吧!
三 Framework .a .dylib/.tbd
1.Framework
Framework的英文意思是框架,主要由Headers,binary文件,.bundle这三个部分组成,除此之外还有info.plist和Modules,后两者主要记录Framework的版本之类的信息,一般都会删掉.
<1>Headers
包含我们在制作Framework的时候暴漏的头文件,所以被暴漏的.h都房子啊这里.
2.binary文件
整个Framework的核心,所有代码都被编译成了这样一个二进制文件,这里需要注意的是添加的依赖库不会被编译进来,用的时候还需要重新link其他依赖库
.bundle文件
资源文件都打包放在这里。在制作Framework的时候不可以把图片直接放在项目中,否则制作好之后图片是一张一张出现在项目中,非常乱。需要新建一个bundle将图片放进去,这里的bundle提供整个SDK的图片资源.需要注意的是图片放进bundle之后,不可以使用[UIImage ImageWIthName:]读取图片,要先找到bundle包在拿图片.
Framework既可以是静态库也可以是动态库,这取决于编译成的Mach-O(就是那个二进制文件)是动态库还是静态库,Framework本质上并不是一个库,它是苹果为了防拜年开发者提供的一种库的打包方式,Framework会将Mach-O文件,头文件,和资源包全都包含起来,不需要你手动整理。我们也可以通过Xcode来制作framework动态库使用。
2 .静态库
这类静态库与framework基本类似,不同的是在打包成.a文件的同时,还需要提供头文件,使用时相较于Framework比较麻烦。.a这样打包不够方便,而Framework编译完成暴漏的文件都已经放好了.
3 .dylib/.tbd 动态库
这类库我们也经常使用,基本上都是系统提供的,一般不自己制作,就算你通过其他的方式制作使用,也可能上不了架的。
四 静态库的制作
<1> .a静态库的制作
(1) 创建项目时,直接选择静态库(.a)
(2)设置需要暴漏的头文件
(3)在模拟器环境下编译(得到模拟器环境下的静态库)
(4)在真机环境下编译(得到真机环境下的静态库)
自己做了一下 感觉挺简单的 但是截图太麻烦 这里贴一下我搜索的资料 看看就很明白了。
<2> Framework的制作
其实 这个也挺简单的 这里我也只贴一下我找的比较简单易懂的资料
五 如果打包包含第三方的framework
看看这里
https://www.jianshu.com/p/68c0f40a3387
https://www.jianshu.com/p/6790fc295f48
iOS 静态库的制作的更多相关文章
- iOS静态库的制作与引用
[iOS静态库的制作与引用] 1.Configuring Exported Headers To configure which headers are exported to clients, se ...
- iOS静态库.Framework制作
首先要解释一下什么是库,库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况要用到库: 某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式 ...
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- iOS静态库.a文件制作和导入使用
iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...
- iOS : 静态库制作
一.静态库简介 1. 什么是库? 库 就是程序代码的集合, 是共享程序代码的一种方式 2. 库的分类? 开源库 公开源代码, 能看到具体实现 例如MJExtension, MJRefresh, AFN ...
- iOS开发之静态库的制作
当你需要和别人分享代码,但又不想让别人看到你内部的实现时就需要制作静态库,通常用于第三方SDK 下面就分享一下制作静态库(.a)的过程: 1.打开Xcode,新建workspace 2.随便给work ...
- IOS静态库
如何在Xcode中创建C++静态库 http://jingyan.baidu.com/article/03b2f78c111fca5ea237ae26.html iOS 如何创建和使用静态库 http ...
- iOS静态库转Framework动态库
参考文章: iOS静态库(.a 和framework) XCode6制作动态及静态Framework 说说iOS中静态库的开发 dyld: Library not loaded: @rpath/ ...
- iOS - 静态库的创建与使用
在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ...
随机推荐
- Spring 集成hibernate时配置连接释放模式
http://zmfkplj.iteye.com/blog/220822 程序出现一个奇怪的现象,用Quartz作业调度启动任务,运行一段时间后,任务会卡在一个查询接口处,久久不能运行完毕. 我本能的 ...
- 初次玩耍lucene.net,一个小小的记录
lucene.net虽说是强大,但是我还是一年前第一次玩耍,然后就没有然后了,最近准备养成记录博客的习惯了,所以又玩了玩,回来记录一下 首先新建一个类,便于调用 public class Lucene ...
- Python解微分方程
1.求解常微分方程的步骤: from sympy import * init_printing() #定义符号常量x 与 f(x) g(x).这里的f g还可以用其他字母替换,用于表示函数 x = S ...
- Leetcode--easy系列3
#26 Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such th ...
- Atitit.常用语言的常用内部api 以及API兼容性对源码级别可移植的重要性 总结
Atitit.常用语言的常用内部api 以及API兼容性对源码级别可移植的重要性 总结 1.1. 要兼容的重要语言api1 1.2. 常用基础api分类 core api1 1.3. 比较常用的扩展库 ...
- Redis提供商配置ASP.NET会话状态
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Co ...
- Quarta介绍
环境:XP+Myeclipse6.5+JDK1.6 quartz官网:http://www.quartz-scheduler.org/ 参考资料 1 Quartz任务调度快速入门 http://www ...
- ashx后门
一.标准ASPX一句话木马 .NET平台下的一句话木马则百年不变,最常见的当属下面这句 <%@ Page Language=”Jscript”%><%eval(Request.Ite ...
- Android 之布局
1.RelativeLayout相对布局 a).第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_center ...
- Win10 Anaconda下TensorFlow-GPU环境搭建详细教程(包含CUDA+cuDNN安装过程)(转载)
win7(win10也适用)系统安装GPU/CPU版tensorflow Win10 Anaconda下TensorFlow-GPU环境搭建详细教程(包含CUDA+cuDNN安装过程) 目录 2.配置 ...