按照公司的想法 要开发一款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. java 线程的几种状态(转载)

      java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在 ...

  2. 虚拟机下安装CentOS无法上网的解决方式

    我使用VMware虚拟机安装Ubuntu和CentOS,都使用NAT模式连接网络,可是Ubutun能够正常上网,而CentOS不能连接到网络. 原来Centos7默认是不启用有线网卡的.须要手动开启. ...

  3. lua_pcall,lua_call 调用前后栈情况

    lua_pcall和lua_call功能一样,只是lua_pcall提供了一个可以提供错误处理函数的功能 首先压入函数 ,再依次压入参数,现在你就可以调用lua_call了,函数调用后将参数,函数都弹 ...

  4. MongoDB密码设置(基于windows)

    参考文档:http://www.cnblogs.com/zengen/archive/2011/04/23/2025722.html   MongoDB部署到Windows上后是默认是无权限限制的的. ...

  5. C++语言基础(14)-typeid

    typeid可用来判断类型是否相等: 例如有下面的定义: char *str; ; ; float f; 类型比较 结果 类型比较 结果 typeid(int) == typeid(int) true ...

  6. grub手动引导win7

    grub>rootnoverify (hd0,0)--->win7系统安装盘号 grub > chainloader +1 grub > makeactive     ---& ...

  7. java - day09 - summerize

    猜字母游戏 package day08_summerize; import java.util.Scanner; import java.util.Random; //猜字母游戏 /** * @aut ...

  8. elasticJob分片跑批

    业务迅速发展带来了跑批数据量的急剧增加.单机处理跑批数据已不能满足需要,另考虑到企业处理数据的扩展能力,多机跑批势在必行.多机跑批是指将跑批任务分发到多台服务器上执行,多机跑批的前提是”数据分片”.e ...

  9. Step By Step(Lua调用C函数)

    原文: http://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html Lua可以调用C函数的能力将极大的提高Lua的可扩展性 ...

  10. OpenAPI初体验

    问题的一开始源于客户和服务部门抱怨我的REST API文档写得不好,然后又了解到 django rest framework 利用 coreapi 能自动生成文档,再就是看到 swagger.io 上 ...