转自:http://blog.csdn.net/jymn_chen/article/details/21036035html
首先科普一下静态库的相关知识:ios
程序编译通常需经预处理、编译、汇编和连接几个步骤。对于咱们项目中的一些公共代码,若是想要对其进行复用,能够把这些代码编译成一个静态库文件。在连接步骤中,连接器会从库文件中取得对应的代码并生成可执行文件。静态库的执行文件中包含了库中的完整代码,可是屡次使用会产生多份冗余拷贝。web
静态库和动态库的区别在于静态库在连接阶段被复制,与程序的运行阶段无关;动态库在程序运行时由系统动态加载到内存中供程序调用,这样能够大大节省内存。xcode
在以前的使用Xcode 5建立本身的Framework中,博主认为能够把一些可复用的代码抽离到一个框架中,然而,通过一些思考,我的以为若是是想将一些可复用的类抽离成通用接口供之后的程序使用的话,仍是写成一个类库的形式比较好。框架和类库虽然相似,可是框架中全部组件同心合力作的是同一件事,解决的是一个较为复杂的问题,例如Foundation框架的目的是构建Cocoa/Cocoa Touch的基础,Hibernate框架的目的是经过ORM实现数据持久化。而类库中的类各有各的功能,它们没有共同的目标,所以相互之间的关联不大。app
下面说的是如何使用Xcode 5在同一个工做空间中建立一个静态库和一个工程来进行测试。框架
1.在桌面创建一个文件夹,命名。iphone
2.打开Xcode,经过菜单新建一个工做空间文件,注意要保存在以前的文件夹中。以下所示:oop
3.在工程导航区中右键,新建一个工程到该工做空间中:测试
注意选择下列模板:ui
4.此时能够添加你的类。例如:
而后作点有挑战性的事,添加一个Category,例如:
5.打开Target的Build Settings,找到iOS Deployment Target,设置静态库支持的最低版本号:
而后打开Target的Build Phases,添加一个Copy Headers的Phase,用于生成向外公开的接口:
在新增长的Copy Headers的Project中增长上面的两个头文件,并将其拖到上面的Public部分中:
6.而后分别选择iOS Device和对应的iOS Simulator,各Build一次:
而后在下面的Products的libJuliaCore.a右键选择Show in Finder,打开后以下所示:
其中iphoneos文件夹中生成的是在真机设备上跑的库文件,iphonesimulator文件夹中生成的是在模拟器中跑的库文件,libJuliaCore.a就是Build出来的静态库文件,usr/local/include目录存放着对应的几个头文件,就是以前在Public中公开的头文件。
这时静态库已经建立成功。
接下来测试一下静态库文件中给出的接口。
首先把iphoneos和iphonesimulator中的libJuliaCore.a和两个头文件分别拷贝到某个路径。
1.在工做空间中右键,新建一个工程,这时选择普通程序模板,例如Single View Application。
建立完成后,工做空间目录以下:
在工程中添加以前拷贝的libJuliaCore.a和.h文件(引用或拷贝都可),若是是在模拟器中跑就拷贝simulator中的,若是是在真机跑就拷贝os中的。
2.接下来调用头文件中给出的接口,例如:
3.Run
4.貌似成功了,可是别忘了还有个Category接口没有测试呢。测试代码:
Run。。。Crash了。
解决方法:
选择运行程序的Target中的Build Settings,将Linking中的Other Link Flags设置为-all_load,以下:
Run,完成,结果以下:
5.跑真机,首先要复制iphoneos中的.a和.h文件,好麻烦的说,有没有方法简化呢?有!将iphoneos和iphonesimulator中的两个libJuliaCore.a文件合并,打开终端,输入下列命令:
前面两个路径是两个.a文件的路径,后面的路径是生成的.a文件路径,能够自定合并后的文件名。
注意原来的两个.a文件在Build时,Build Settings中的Architectures必须保持一致,不然会合并失败。
使用Merge后的.a文件能够在真机和模拟器中跑了。
若是64位的iphone模拟器编译出错,将其Architectures修改成armv7和armv7s就能够了:
这种静态库文件和普通的开源类库最大的区别就是静态库不公开实现代码,只给出头文件,对于一些不想公开源码的场合就派上用场了。我就用过一个将caf转换为mp3的静态库lame:
最后的最后,附上一个Demo,也为本身留个笔记:点击下载
参考文章: