按照公司的想法 要开发一款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)在真机环境下编译(得到真机环境下的静态库)

自己做了一下 感觉挺简单的 但是截图太麻烦 这里贴一下我搜索的资料 看看就很明白了。

.a 静态库的制作步骤详解

<2> Framework的制作

其实 这个也挺简单的 这里我也只贴一下我找的比较简单易懂的资料

framework SDK的制作

五 如果打包包含第三方的framework

看看这里

https://www.jianshu.com/p/68c0f40a3387

https://www.jianshu.com/p/6790fc295f48

iOS 静态库的制作的更多相关文章

  1. iOS静态库的制作与引用

    [iOS静态库的制作与引用] 1.Configuring Exported Headers To configure which headers are exported to clients, se ...

  2. iOS静态库.Framework制作

    首先要解释一下什么是库,库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况要用到库: 某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式 ...

  3. iOS开发中静态库之".framework静态库"的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...

  4. iOS静态库.a文件制作和导入使用

    iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...

  5. iOS : 静态库制作

    一.静态库简介 1. 什么是库? 库 就是程序代码的集合, 是共享程序代码的一种方式 2. 库的分类? 开源库 公开源代码, 能看到具体实现 例如MJExtension, MJRefresh, AFN ...

  6. iOS开发之静态库的制作

    当你需要和别人分享代码,但又不想让别人看到你内部的实现时就需要制作静态库,通常用于第三方SDK 下面就分享一下制作静态库(.a)的过程: 1.打开Xcode,新建workspace 2.随便给work ...

  7. IOS静态库

    如何在Xcode中创建C++静态库 http://jingyan.baidu.com/article/03b2f78c111fca5ea237ae26.html iOS 如何创建和使用静态库 http ...

  8. iOS静态库转Framework动态库

    参考文章: iOS静态库(.a 和framework)  XCode6制作动态及静态Framework  说说iOS中静态库的开发  dyld: Library not loaded: @rpath/ ...

  9. iOS - 静态库的创建与使用

    在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ...

随机推荐

  1. Ubuntu——修正LibreOffice中文乱码以及eclipse提示框颜色

    刚进ubuntu的时候就老遇到用libreoffice打开某些文档时出现一堆叠在一起的乱码.以及最開始使用eclipse编辑时,鼠标放到一个变量或者函数时 弹出来一黑框框-看的难受的.... 这里记录 ...

  2. 笛卡尔树 POJ ——1785 Binary Search Heap Construction

    相应POJ 题目:点击打开链接 Binary Search Heap Construction Time Limit: 2000MS   Memory Limit: 30000K Total Subm ...

  3. /proc/meminfo详解 = /nmon analysis --MEM

    memtotal hightotal lowtotal swaptotal memfree highfree lowfree swapfree memshared cached active bigf ...

  4. javascript-ajax之json学习笔记

    ajax什么时候解析json的时候用eval 1.如果是原生js实现的ajax,就需要eval转json对象 如果使用了类似jquery的js插件,里面有些方法是不需要转的,因为jquery已经帮你处 ...

  5. sql中的笛卡尔积

    sql中的笛卡尔积 我们对数据库表进行操作时,经常会对多张表进行关联,多表连接查询大家肯定不会陌生,但是一不小心很容易出来庞大冗余的数据. 笛卡尔积数学概念 笛卡尔积是指在数学中,两个集合X和Y的笛卡 ...

  6. 记一起和前端没什么卵关系的OPTION 405问题

    记一起和前端没什么卵关系的后端405问题 问题的关键点在于本来是POST请求,会变成OPTION请求,并且提示405报错,会类似跨域.并且只有某些手机机型才会(如Oppo系列). 其实跨域的问题,如果 ...

  7. gitlab 6 安装备忘录

    gitlab 6.2-stable;Ubuntu 13.10;ruby 2.0.0 推荐使用PostgreSQL,MySQL不同版本可能碰到兼容性问题(www.oschina.net/question ...

  8. RPC框架-yar学习

    RPC采用客户机/服务器模式. 请求程序就是一个客户机,而服务提供程序就是一个服务器.首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息.在服务器端, 进程保持睡眠状态直到调 ...

  9. C++语言基础(4)-构造函数和析构函数

    一.构造函数 类似于java,C++中也有构造函数的概念,相关用法如下: 1.1 构造函数的定义 #include <iostream> using namespace std; clas ...

  10. 27. Remove Element【easy】

    27. Remove Element[easy] Given an array and a value, remove all instances of that value in place and ...