您的位置:首页 > 移动开发 > IOS开发

浅谈iOS开发.a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

2015-12-18 14:42 561 查看
最近一个人在做一个即时通讯SDK的项目,所以就用到了静态库的打包,开始遇到一些困难和莫名的bug,不过现在已经基本完成。现在,浅谈一下个人经验。首先,概述一些最基本的名词概念,也是为了大家能更好的理解我们究竟在做什么 为什么要这样做  有了这些基本的逻辑思维  那么其他什么就都不是事哈 (不要拦我 我要开始发功了)哈哈哈

一、概念篇

什么是库?
库是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为2种类型
开源库
公开源代码,能看到具体实现
比如SDWebImage、AFNetworking
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
静态库和动态库的存在形式
静态库:.a 和.framework
动态库:.dylib 和.framework
静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
需要注意的是:
动态库,不能被上传到AppStore(逼格太高 大苹果可是不允许的哈  哈哈)

总结:个人觉得 .a静态库的 本身就是一个对代码或者一个功能的封装,只不过是不开源的。

二、制作流程(如下均是Xcode7展示的操作)

新建一个纯净的项目-> 选择 “Cocoa Touch Static Library”



输入想要打包的静态库的名称



把库需要包含的源代码拖入此项目中





此处有一些注意点见下图



选择需要暴露出来的.h文件,.m文件会自动编译到.a文件中





分别选择模拟器和真机(并不需要真正的手机),依然Command+B ,模拟器和真机环境下用的.a文件是分开的





这一步,如果看到.a文件由红变黑说明编译等都没有问题  已经完成一半了

右击“ShowInFinder”,查看制作好的.a文件

n


Debug-iphoneos文件夹里面的东西是用在真机上的
Debug-iphonesimulator文件夹里面的东西是用在模拟器上的



如果想让一个.a文件能同时用在真机和模拟器上,需要进行合并

在终端输入指令

首先文件切换到 Products文件夹 



然后输入

lipo -create Debug-iphoneos/libXXX.a
Debug-iphonesimulator/libXXX.a  -output 
libXXX.a

蓝色部分是固定指令
红色、紫色是真机和模拟器.a文件的路径
绿色是所合成.a文件的路径
.a文件的体积(一般情况下)
真机用的.a> 模拟器用的.a
所合成.a== 真机用的.a+
模拟器用的.a





使用.a 静态库

现在.a静态库和头文件都有了就可以把它们拖到项目中使用了

使用时直接#import"xxx.h"就可以直接导入调用使用了

至此,静态库算是制作完了,但是有以下几点需要说明

无论是 .a 静态库还是.framework
静态库,最终需要的都是:
二进制文件 +.h+
其它资源文件

倘若自己所需要打包的静态库代码中用到了别人的三方框架比如“AFNetworking”等,此时只需要把用到的三方库文件的头文件在选择暴露头文件时都给暴露出去,然后导入的项目中如果也用到了相同的三方框架,此时此项目就不需要拖入这个三方库代码直接,需要使用时直接把你所提供的.a静态库和头文件导入 然后#import你所提供的相关头文件即可使用(注意:一定是以你的打包的为准)比如 直接#import"xxx.h"

若是自己的静态库原代码中使用了分类  比如NSString+xxxx,此时一定需要更改下项目的环境配置

添加一个“-ObjC”(注意"O""C"是大写的)



总结:个人的第一个博客,各种小紧张哈,若有问题可以直接在博客回复。个人原创,转载请说明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息