转自:http://blog.csdn.net/jymn_chen/article/details/21036035

首先科普一下静态库的相关知识:

程序编译一般需经预处理、编译、汇编和链接几个步骤。对于我们项目中的一些公共代码,如果想要对其进行复用,可以把这些代码编译成一个静态库文件。在链接步骤中,链接器会从库文件中取得对应的代码并生成可执行文件。静态库的执行文件中包含了库中的完整代码,但是多次使用会产生多份冗余拷贝。

静态库和动态库的区别在于静态库在链接阶段被复制,与程序的运行阶段无关;动态库在程序运行时由系统动态加载到内存中供程序调用,这样可以大大节省内存。

在之前的使用Xcode 5创建自己的Framework中,博主认为可以把一些可复用的代码抽离到一个框架中,然而,经过一些思考,个人觉得如果是想将一些可复用的类抽离成通用接口供以后的程序使用的话,还是写成一个类库的形式比较好。框架和类库虽然类似,但是框架中所有组件同心协力做的是同一件事,解决的是一个较为复杂的问题,例如Foundation框架的目的是构建Cocoa/Cocoa Touch的基础,Hibernate框架的目的是通过ORM实现数据持久化。而类库中的类各有各的功能,它们没有共同的目标,因此相互之间的关联不大。

下面说的是如何使用Xcode 5在同一个工作空间中创建一个静态库和一个工程来进行测试。

1.在桌面建立一个文件夹,命名。

2.打开Xcode,通过菜单新建一个工作空间文件,注意要保存在之前的文件夹中。如下所示:

3.在工程导航区中右键,新建一个工程到该工作空间中:

注意选择下列模板:

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.接下来调用头文件中给出的接口,例如:

  1. #import "ViewController.h"
  2. #import "JuliaCore.h"
  3. @implementation ViewController
  4. - (void)viewDidLoad
  5. {
  6. [super viewDidLoad];
  7. [JuliaCore showLibraryDescription];
  8. }
  9. @end

3.Run

4.貌似成功了,但是别忘了还有个Category接口没有测试呢。测试代码:

  1. #import "ViewController.h"
  2. #import "JuliaCore.h"
  3. #import "NSString+Test.h"
  4. @implementation ViewController
  5. - (void)viewDidLoad
  6. {
  7. [super viewDidLoad];
  8. //    [JuliaCore showLibraryDescription];
  9. NSString *str = @"String";
  10. NSLog(@"%@", [str stringWithJCPrefix:str]);
  11. }
  12. @end

Run。。。Crash了。

  1. 2014-03-11 21:56:26.090 JuliaCoreDemo[3346:70b] -[__NSCFConstantString stringWithJCPrefix:]: unrecognized selector sent to instance 0x35b4
  2. 2014-03-11 21:56:26.095 JuliaCoreDemo[3346:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString stringWithJCPrefix:]: unrecognized selector sent to instance 0x35b4'

解决方法:

选择运行程序的Target中的Build Settings,将Linking中的Other Link Flags设置为-all_load,如下:

Run,完成,结果如下:

  1. 2014-03-11 22:01:50.816 JuliaCoreDemo[3390:70b] JCString

5.跑真机,首先要复制iphoneos中的.a和.h文件,好麻烦的说,有没有方法简化呢?有!将iphoneos和iphonesimulator中的两个libJuliaCore.a文件合并,打开终端,输入下列命令:

  1. $ lipo -create ./os/libJuliaCore.a ./simulator/libJuliaCore.a -output ./JuliaCore-Merge.a

前面两个路径是两个.a文件的路径,后面的路径是生成的.a文件路径,可以自定合并后的文件名。

注意原来的两个.a文件在Build时,Build Settings中的Architectures必须保持一致,否则会合并失败。

使用Merge后的.a文件可以在真机和模拟器中跑了。

如果64位的iphone模拟器编译出错,将其Architectures修改为armv7和armv7s就可以了:

这种静态库文件和普通的开源类库最大的区别就是静态库不公开实现代码,只给出头文件,对于一些不想公开源码的场合就派上用场了。我就用过一个将caf转换为mp3的静态库lame:

最后的最后,附上一个Demo,也为自己留个笔记:点击下载

参考文章:

IOS 使用Xcode5制作静态库详解

ios静态库制作中的注意事项

IOS开发~Cocoa Touch Static Library(静态库)

iOS 静态类库项目的建立与使用

使用Xcode 5创建Cocoa Touch Static Library(静态库)的更多相关文章

  1. ios中静态库的创建和使用、制作通用静态库(Cocoa Touch Static Library)

    创建静态库可能出于以下几个理由: 1.你想将工具类代码或者第三方插件快捷的分享给其他人而无需拷贝大量文件.2.你想让一些通用代码处于自己的掌控之下,以便于修复和升级.3.你想将库共享给其他人,但不想让 ...

  2. iOS在Cocoa Touch Static Library使用CocoaPods

    1.在XCode中新建静态库工程:DDLogLib. 2.添加对外暴露接口的头文件DDLogLibHeader.h 3.命令行进入DDLogLib目录,运行pod init,并修改Podfile 4. ...

  3. iOS制作Static Library(静态库),实现多工程的连编

    在iOS开发中,我们会发现一些偏底层或基础代码是直接可以复用的,当我们换一个项目,改变的只需要是偏上层的业务逻辑代码,所以我们可以把这部分基础代码制作为一个静态库static library,并不断扩 ...

  4. 创建静态库Static Library(Framework库原理相似)

    在项目开发的过程中,经常使用静态库文件.例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节. 简介: 库是一些没有ma ...

  5. VC win32 static library静态链接库简单示例

    中午在宿舍闲来没事,看到网上一篇帖子,关于静态链接库的英文示例.它在.Net上开发,我将其移到VC上开发,因此对其代码做了相应修改.帖子内容如下:(代码我已修改).原帖见:http://msdn.mi ...

  6. Xcode 创建静态库和动态库

    1.linux中静态库和动态库区别: 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库:这类库的名字一般是libxxx.a:利用静态函数库编译成的文件 ...

  7. iOS xcode创建静态库封装自己的SDK及使用

    https://www.cnblogs.com/JustForHappy/p/5773039.html 一,静态库和动态库的区别在这里就不说了,个人感觉如果是自己封装提供别人下载的话应该是静态库比较方 ...

  8. iOS静态库及Framework 创建

    本文转自cocoachina,尊重作者的汗水. 讲述的非常透彻,有需要的朋友可以阅读实践.转载请注明出处 //=================以下留着备份==================// 在 ...

  9. Xcode 之自己编译静态库

    今天介绍下,如何利用Xcode,新建一个静态库,以及如何编译成i386.armv7.armv7s 等平台架构. 开发环境:MAC OS X 10.9.4 + Xcode 5.0.2 背景知识:库分两种 ...

随机推荐

  1. 灰度图像二值化-----c++实现

    前天闲着没事干,就写了写BMP图像处理,感觉大家还比较感兴趣..所以现在没事,继续更新..这次简单的写了灰度图像二值化..这是什么概念呢? 图像的二值化的基本原理 图像的二值化处理就是将图像上的点的灰 ...

  2. iOS判断日期A是否在日期B到日期C之间

    方法一: 可以用nsdate 的 timeIntervalSince1970 方法把时间转换成时间戳进行比较,这里timeIntervalSince1970返回的是NSTimeInterval(dou ...

  3. cmd命令之set详解

    C:\Users\Administrator>set ALLUSERSPROFILE=C:\ProgramData APPDATA=C:\Users\Administrator\AppData\ ...

  4. 栈的应用实例——计算后缀表达式

    用户输入一个后缀表达式,程序计算该后缀表达式的值并输出结果: /* postfix_expression.c */ #include "stack.h" #include < ...

  5. 算法笔记_109:第四届蓝桥杯软件类省赛真题(JAVA软件开发本科B组部分习题)试题解答

    目录 1 马虎的算式 2 黄金连分数 3 有理数类 4 幸运数 5 连号区间数   前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 马虎的算式 标题: 马虎的算式 小明 ...

  6. 算法笔记_181:历届试题 回文数字(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的.这样的数字叫做:回文数字. 本题要求你找 ...

  7. JavaScript 纯粹对象

    JavaScript 纯粹对象 1.定义: 通过 "{}" 或者 "new Object" 创建的对象,像new Date(),new String()都不是纯 ...

  8. iscsi initiator端Note

    iscsi initiator端    (1)安装open-scsi      sudo  apt-get install open-iscsi open-iscsi-utils     (2)cha ...

  9. 16、java包装类

    一.包装类的由来: JAVA是面向对象的编程语言,但它也包含了8种基本数据类型,这8个基本数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备“对象”的特性:没有属性,方法可以被调用.JAVA ...

  10. LoadRunner脚本关联动态数据的最简单方法

    为什么要关联动态数据呢?举个例子,在对我们平台的工作流性能测试时, 在待办任务里面选择一条记录执行发送操作,LoadRunner VuGen会详细记录下来流程发送操作的细节,但在回放脚本的时候会有问题 ...