iOS的软件开发工具包SDK,一般是以库的形式出现,从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。开发过程中,我们常常会用到第三方的SDK。尤其是微信、QQ、百度地图、支付功能等。其实我们也可以制作属于自己的库文件呢?如果,将自己写的功能类编译成库文件,分发给其他人来使用呢?

库分 静态库 和 动态库 两种:
1、静态库有 .a 和 .framework两种形式;
2、动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式。

静态库和动态库区别,是相对编译期和运行期的:
1、静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;
2、动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。


PS总结:
1、同一个静态库在不同程序中使用时,每一个程序中都得导入一次,打包时也被打包进去,形成一个程序;
2、而动态库在不同程序中,打包时并没有被打包进去,只在程序运行使用时,才链接载入(如系统的框架如UIKit、Foundation等),所以程序体积会小很多,但是苹果不让使用自己的动态库,否则审核就无法通过。


这篇文章主要先针对 framework
静态库的制作过程进行阐述,,由于自己能力小菜,没有实际打包过framework的操作,其实过程跟.a的打包有点类似,不过还是转载一下大神们的一些经验,并绕过一些制作当中的大神们遇到的坑部分后分享给大家,制作环境都是最新的Xcode8来操作!好吧,了解了以上问题之后,让我们开始吧~~~~~

正文:

首先新建一个项目,选择Cocoa touch Framework


然后随便取一个名字


然后将要封装成framework的代码文件拖入工程


接下来,我们【选择工程文件 –> TARGETS第一项 –> Build Setting –> 在搜索栏输入linking】,然后几个需要设置的选项都显现出来,首先是【Dead Code Stripping】设置为NO,如下图:
PS:网上对此项的解释如下The resulting executable will not include any “dead” or unreachable code大致意思是如果开启此项就会对代码中的“dead”、“unreachable”的代码过滤,不过这个开关是否关闭,似乎没有多大影响,不过为了完整还原framework中的代码,将此项关闭也未曾不可

接着我们将【Link With Standard Libraries】关闭,如下图:
PS:我想可能是为了避免重复链接

最后将Mach-O Type设为Static Library,如下图:
PS:framework可以是动态库也可以是静态库,对于系统的framework是动态库,而用户制作的framework只能是静态库


接着我们在【Build Setting –> Build Active Architecture Only】菜单中,将其设置为NO,如下图:
PS:如果此选项设为YES,会导致其编译时只生成当前机器的框架,将其设置为NO后,编译后生成的framework同时兼容多个架构


然后点击【Build Phases】选项,我们需要将公开的头文件从Project中拖入Public,如下图:
PS:至于是否需要将私有的头文件拖入Private,我觉得直接放在Project中即可,若是Private中有头文件,打包以后的framework中会多出一个Private的文件夹包含着放入Private的头文件,不过我觉得如果是私有最好还是不要让别人看到


接下来我们可以对一些特殊机型的添加支持,添加armv7s架构,如下图:
PS:当然不添加也没什么问题,因为只有5和5c使用了此架构


下面就开始编译阶段了,如下图,先选择编译选项【Generic iOS Device】,按下Command+B 我们来Build一下
PS:这样一Build,其实可以看作就是真机跑了一遍


然后随意选择一个模拟器,按下Command+B 再次Build一下 ,如下图:


右键选择项目中的framework包,点击【Show in Finder】找到Build后的 framework ,如下图:


我们看到总共有两个文件夹,上面是真机编译生成的文件,下面是模拟器编译生成的文件,如下图:


然后我们找到这两个文件夹路径最下面的.framework文件,如下图:
 

——————————————————————————————————————————————————–


接着用命令行将下面两个文件进行合成, 将合成后的文件输出到桌面上,
命令格式:lipo -create 真机里.framework文件的绝对路径 第二个模拟器里.framework文件的绝对路径 -output 最终的.framework文件路径。 记得每一个文件路径输入后都需要用 空格 隔开哦
本博文中使用的命令如下:


然后用输出在桌面上的YuXinSDK.framework替换掉前面Debug-iphoneos文件夹中的framework包里面的YuXinSDK.framework
接着制作完毕了,我们将这做好的【Debug-iphoneos文件夹中的 framework包】直接拖入要使用的工程当中,如下图:

注意将【Copy items if needed】选项打勾,如下图:


然后在工程的【Build Setting –> 在搜索栏输入search】在search path中加上此framework的Headers的路径,如下图:

成功加上路径之后,我们可以看到,如下图:


好吧,大功告成,我们Run一下,成功运行!~~~

转载:http://blog.csdn.net/sinat_16714231/article/details/52857222

Xcode8如何创建Framework静态SDK库的更多相关文章

  1. 利用CMake自己创建OpenCV静态链接库

    1.准备工作: 1)完成Visual Studio2012安装: 2)下载并解压CMake3.5.0: 3)下载并解压OpenCV2.4.12: 4)下载并解压TBB44_20160128oss. 2 ...

  2. VS2010创建C++静态链接库创建和使用

    VS2010创建C++静态链接库的方法: 1. 创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入 staLIB.点击确定. 2.在解决方案资源管理 ...

  3. 经验分享:Xcode 创建.a和framework静态库【转】

    作者:Haley_Wong 最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态 ...

  4. 经验分享:Xcode 创建.a和framework静态库

    最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的 ...

  5. Xcode 创建.a和framework静态库(转)

    最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.iOS中的静 ...

  6. Xcode 创建.a和framework静态库(转载)

    库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framew ...

  7. Xcode 创建.a和framework静态库

    库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framew ...

  8. iOS:Xcode7下创建 .a静态库 和 .framework静态库

    Xcode7 中创建静态库:.a 和 .framework 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开 ...

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

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

随机推荐

  1. mybatis的dao向mapper.xml传入多参数

    https://www.cnblogs.com/super-chao/p/7722411.html 如果两种不同类型的参数传入,parameterType可以不写,直接获取#{0},#{1}就可以传入 ...

  2. Code Chef GEOCHEAT(凸包+旋转卡壳+随机化)

    题面 传送门 题解 以下记\(S_i=\{1,2,3,...,i\}\) 我们先用凸包+旋转卡壳求出直径的长度,并记直径的两个端点为\(i,j\)(如果有多条直径随机取两个端点) 因为这个序列被\(r ...

  3. 3.jquery在js文件中获取选择器对象

    一.常用的选择器有一下几种: 1.标签选择器 2.类选择器 3.id选择器 4.并集选择器 5.层级选择器 二.如何获取选择器对象: <!DOCTYPE html> <html la ...

  4. Mutual Training for Wannafly Union #6 E - Summer Trip(并查集)

    题目链接:http://www.spoj.com/problems/IAPCR2F/en/ 题目大意: 给m个数字代表的大小,之后n组数据,两两关联,关联后的所有数字为一组,从小到大输出组数以及对应的 ...

  5. CTFcrackTools-V3 – 一款旨在帮助 CTFer 在 CTF 中发挥作用的一个框架

    CTFcrackTools-V3 CTFcrackTools重置版 作者:米斯特安全-林晨.摇摆.奶权 米斯特安全团队首页:http://www.hi-ourlife.com/ 部分插件来源:希望团队 ...

  6. kubernetes traefik multiple namespaces

    官方文档在此 https://docs.traefik.io/user-guide/kubernetes/ 官方文档在配置 RBAC 时使用了 ClusterRoleBinding, 当你想用多命名空 ...

  7. Apache TraceEnable关闭与测试方法

    系统环境:OS: RHEL5.6_x64Apache: httpd-2.2.11 关闭方法:在主配置文件httpd.conf中添加配置:TraceEnable off可以直接配置在ServerRoot ...

  8. libevent源码剖析

    libevent是一个使用C语言编写的,轻量级的开源高性能网络库,使用者很多,研究者也很多.由于代码简洁,设计思想简明巧妙,因此很适合用来学习,提升自己C语言的能力. libevent有这样显著地几个 ...

  9. Sip协议

    会话初始协议.SIP是IETF标准进程的一部分,它是在诸如SMTP(简单邮件传送协议)和HTTP(超文本传送协议)基础之上建立起来的(请求应答的通讯模式).微信采用了自主研发的SYNC协议,他通过“握 ...

  10. day 48 ORM 进阶 多表连接 创建 以及 html模板继承

    多表的一对多创建 多表的多对多创建 多表的一对多修改 多表的多对多修改 前情提要:   最近认识了不少大佬,大佬开着保时捷. .一顿狂奔..我连车尾灯都看不到.. 本次内容  ORM 的多表链接  查 ...