iOS-Xcode制作静态库

来源:互联网 发布:罗马方阵vs秦军 知乎 编辑:程序博客网 时间:2024/06/06 01:57

1.首先我想要将为Unity写的iOS插件制作成静态库.a文件.
1.1首先建一个项目TestLib,选择Cocoa Touch Static Libra如下:
这里写图片描述
将里面的.h和.m文件删掉,将我自己写得插件.m/.mm和.h文件拷贝到工程中,
可能出现问题0:不认识UnitySendMessage()方法;
解决:需要声明该方法:
extern “C” {
void UnitySendMessage (const char* obj, const char* method, const char* msg);
}
可能出现问题1:代码签名
这里写图片描述
解决:
这里写图片描述
可能出现问题2:若是你只是将部分OC代码文件打包,可能某些.m文件中用到了其他头文件中的函数,应将其他头文件放到项目中来进行打包静态库。
1.2设置:
选择Edit Scheme,当我们选择的是iOS Device时我们可以得到只能用于真机测试的静态库,当选择为其他iOS模拟器时,我们可以得到只能用于模拟器的静态库.后面我们会合成能同时用于两者的静态库.
这里写图片描述
可以看到我们可以得到四种静态库,当我们使用静态库时需要这里的设置也要对应.有的同学在用.a文件时发现还是报”… Missing required architecture ……”,就是因为没有设置对应.
1.3选择需要暴露出来的.h文件,.m文件会自动编译到.a文件中
这里写图片描述
添加,并选择需要暴露的头文件
这里写图片描述
这里写图片描述
设置(移动)为公开的。
这里写图片描述
若静态库需要暴露的.h比较多,可以考虑创建一个主头文件(一般主头文件和静态库同名),在主头文件中包含所有其他需要暴露出来的.h文件,使用静态库时,只需要#import主头文件,实际上苹果官方就是这么做的,例如:这里写图片描述
在构建之前:
这里写图片描述
红色说明这些文件不存在.
我们点击运行,生成静态库文件.然后在静态库文件上右击->ShowInFinder;此时我们到达项目Xcode的DerivedData文件夹的子目录中了(位置:/Users/xingyang/Library/Developer/Xcode),此时我们可以得到静态库文件了.你可以将该文件放到Unity项目中的Plugins->iOS目录中了.
这就是生成静态库文件的目录:生成了真机和模拟器的测试和发布版本的静态库
这里写图片描述
获得.h文件
这里写图片描述
1.4那么在使用静态库的iOS工程中是否需要.h文件呢?
这得看你是否需要用到了,若iOS插件被调用的方法只是extern “C”中的C方法的话那么就不需要了,若调用的是类的方法的话当然需要.h文件咯.
1.5使用静态库
直接将.a,.h,资源文件拖拽到其他项目中即可.别人拿到的框架,只有.a文件和暴露出来的头文件,若库中还包含了一些资源文件(如图片等),那么资源文件也应该放在上面的文件夹中.
如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance)
解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC
这里写图片描述

2.合成真机和iOS模拟器都可以用的通用静态库.
2006年1月起苹果CPU开始采用Intel芯片所以iOS模拟器当然就是使用了Intel指令集架构例如i386,X86指令集架构.而所有的iPhone和iPad的CPU使用的都是ARM指令集架构.所以使用的静态库应该能够支持相应的CPU指令集架构:
这是当错误使用了只支持真机的静态库文件出现的错误:
这里写图片描述
2.1那么如何查看静态库文件支持指令集架构呢?
这是查看我生成的只用于iOS模拟器的静态库文件libPrint.a所支持的指令集架构:
这里写图片描述
这是查看我生成的只用于真机的静态库文件libPrint.a所支持的指令集架构:
这里写图片描述
合成支持iOS模拟器和真机的通用静态库文件liblib.a
这里写图片描述
这是查看我生成的用于通用静态库文件liblib.a所支持的指令集架构:
这里写图片描述
可以看到全部都支持了吧.
合并出来的通用版本静态库大小>=只用于模拟器的+只用于真机的
只用于真机的>只用于模拟器的

3.图片资源的处理
如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致;
bundle的创建:新建一个文件夹,修改扩展名为 .bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西
建议:自己制作的静态库中要用到的图片资源,不建议直接以png的后缀名方式拖到项目中使用,而是推荐使用放到bundle文件中。这样可以避免静态库的图片名和使用静态库的项目中存在的图片产生冲突。
1)新建一个文件夹,把需要打包的资源图片放在里面
这里写图片描述
2)修改扩展名为 .bundle,敲回车,点击添加。
这里写图片描述

4.静态库介绍:
4.1意义:封装代码利于知识产权保护;可将.h和静态库文件分发给别人利于团队协作即包括各种商业第三方库和SDK的使用.程序的模块化,使得固定的业务模块化成静态库.
4.2库的分类:
什么是库:程序代码的集合,是共享代码的一种方式;
分类:
开源库:公开源码,能看到具体实现,比如:SDWebImage,AFNetworking;
闭源库:不公开源码,是经过编译后的二进制文件,看不到实现;分为静态库和动态库.

静态库:.a和.framework.链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝,如图:
这里写图片描述
动态库:.dylib和.framework.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存,如图:
这里写图片描述
无论是 .a 静态库还是 .framework 静态库,最终需要的都是:二进制文件 + .h + 其它资源文件;
.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用;
.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用;
系统的 .framework 是动态库,我们自己建立的 .framework 是静态库;

Tips:
1.资源文件是不能打包到.a文件中的.
2.项目中如果使用了自制的动态库,不能被上传到AppStore

示例代码下载:http://download.csdn.net/detail/wuming22222/8469991
参考链接:
http://blog.csdn.net/pjk1129/article/details/7255163
http://www.cnblogs.com/speeding/archive/2011/09/29/2195252.html
http://www.cnblogs.com/wendingding/p/3893095.html
http://www.cocoachina.com/industry/20131204/7468.html

0 0
原创粉丝点击