创建静态库Static Library(Framework库原理相似)
在项目开发的过程中,经常使用静态库文件。例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节。
简介:
库是一些没有main函数的程序代码集合。除了静态库,还有动态链接库,他们之间的区别是:静态库可以编译到我们的执行代码中,应用程序可以在没有静态库的环境中运行;动态库不能编译到我们的执行代码中,应用程序必须在有链接库文件的环境下运行。
创建静态库的步骤如下所示,
1、创建Static Library,新建->Project,选择Static Library,如图,

点击Next,我将Static Library项目名称命名为TimeDate,因为这是我用于处理时间和日期的静态库工程,

2、静态库文件功能的实现细节
创建了静态库Static Library项目之后,Xcode自动为我们创建了TimeDate.h/.m文件,如下图所示,

这时候我们需要在这里面填充一些细节,这里,我想要实现的功能就是将时间戳NSTimeInterval转换成NSString的功能,那么代码的细节如下所示,
TimeDate.h文件
@interface TimeDate : NSObject
- (NSString *)changeToStandardTime:(NSTimeInterval)timeInterval;
@end
TimeDate.m文件
#import "TimeDate.h"
@implementation TimeDate
- (NSString *)changeToStandardTime:(NSTimeInterval)timeInterval
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *time = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:timeInterval]];
return time;
}
@end
上面的代码就是将NSTimeInterval转换成NSString,当然这样肯定有考虑不全面的地方,这不是本篇博客的中心内容,读者可以忽略;如果有好的建议请告诉我。
3、编译项目,生成对应的静态库.a文件
首先我们先来看一下编译(Command+B)之前的项目细节,如下图,

这里我们有两个细节需要注意的,①表明现在是选择的是名为pythonhater的真机Device;②libTimeDate.a文件是红色状态,表明这还不是一个实际存在的文件,我们不能在物理磁盘中找到它。只有在编译以后它才是一个实实在在的文件。
这时我们编译项目(Command+B),文件结构如下图,

这时候libTimeDate.a文件变为黑色状态了,表明编译过后它是一个真是存在于物理磁盘的文件,我们右键选择Show in Finder,如下图,出现了它的物理位置,


如图,libTimeDate.a文件隐藏的很深,我们只要知道它存在就好。现在有个问题,我选择的是pythonhater真机Device进行编译的,所以这个libTimeDate.a只能针对iOS真机Device进行使用,而不能在模拟器Simulator上面使用,为了解决这个问题,只要选择模拟器Simulator进行编译,就可以生成对应的模拟器运行需要的libTimeDate.a文件,如下图操作所示,

选择iPhone模拟器编译,然后右键Show in Finder,

上面的Debug-iPhones里面包含iPhone真机所需要的libTimeDate.a静态库文件,而下面的Debug-iPhoneSimulator里面包含的时iPhone模拟器所需要的libTimeDate.a静态库文件。
4、合并静态库
针对真机和模拟器的静态库文件只能在一个平台下面使用,好在我们可以将真机和模拟器上面的静态库文件合并成一个在真机和模拟器都可以使用的静态库文件,通过在终端输入命令即可完成该目的,

完整的命令就是:
lipo -create /Users/mini3/Library/Developer/Xcode/DerivedData/TimeDate-cthodjhjpplctjhfdbhmdcuhwnva/Build/Products/Debug-iphoneos/libTimeDate.a /Users/mini3/Library/Developer/Xcode/DerivedData/TimeDate-cthodjhjpplctjhfdbhmdcuhwnva/Build/Products/Debug-iphonesimulator/libTimeDate.a -output /Users/mini3/Desktop/libTimeDate.a
不过这个是相对自己的路径,读者可以直接将文件拖到终端即可识别完整的路径,如下图所示的方法,



最后在补充上- output /Users/用户名/Desktop/libTimeDate.a,这样就在桌面生成了一个合并过后的libTimeDate.a静态库文件,它可以再真机和模拟器上面同时使用。
5、使用静态库文件,
这时候我们就可以使用自己创建、编译生成的静态库文件了,将TimeDate.h文件和桌面上面的libTimeDate.a文件拖到想要使用的项目中,如下图的目录结构,

为了方便,我直接在AppDelegate中使用创建的静态库文件了,代码如下,
AppDelegate.m文件
#import "AppDelegate.h"
//导入头文件
#import "TimeDate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
TimeDate *timeDate = [[TimeDate alloc] init];
NSTimeInterval timeInterval = 123456798;
NSString *time = [timeDate changeToStandardTime:timeInterval];
NSLog(@"time is %@",time);
return YES;
}
输出的内容是,
2014-06-25 20:56:15.105 StaticLibrarySample[2517:390790] time is 1973-11-30 05:33:18
这时不管是真机还是模拟器都可以编译通过,正常运行。而使用者只能通过头文件知道我们提供的借口,却不知道实现文件中实现的细节,这有效地隐藏了自己的核心技术和机密内容。
总结:我们开发的就是iOS真机程序,所以可以选择不合并静态库,直接使用真机编译生成的静态库文件进行开发,没有必要为了兼容模拟器而合并静态库文件。当然,如果有强迫症或者公司设备不够,那么还是合并静态库文件吧。
感想:很早就想总结一下静态库的东西,但是感觉没有必要,也不知道怎么系统的总结。最近项目中,发现老大对于项目依赖关系处理的很牛逼,我很羡慕。如果我想达到他那样的水平,必须从头开始好好了解,而这第一步基本就是静态库方面的东西,所以必须走好第一步。这篇博客也算是我写项目依赖关系博客的前奏,后面我会更加深入的记录我自己对于项目管理方面的一些理解,希望对读者有所帮助。
创建静态库Static Library(Framework库原理相似)的更多相关文章
- iOS 元件组件-创建静态库static library
概述 在项目开发的过程中,经常使用静态库文件.例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节. 库是一些没有mai ...
- 使用Xcode 5创建Cocoa Touch Static Library(静态库)
转自:http://blog.csdn.net/jymn_chen/article/details/21036035 首先科普一下静态库的相关知识: 程序编译一般需经预处理.编译.汇编和链接几个步骤. ...
- Linux - 动态(Dynamic)与静态(Static)函数库
首先我们要知道的是,函式库的类型有哪些?依据函式库被使用的类型而分为两大类,分别是静态 (Static) 与动态 (Dynamic) 函式库两类. 静态函式库的特色: 扩展名:(扩展名为 .a) ...
- iOS制作Static Library(静态库),实现多工程的连编
在iOS开发中,我们会发现一些偏底层或基础代码是直接可以复用的,当我们换一个项目,改变的只需要是偏上层的业务逻辑代码,所以我们可以把这部分基础代码制作为一个静态库static library,并不断扩 ...
- iOS:创建静态库及其使用
本篇来自转载,原创链接为:http://my.oschina.net/leejan97/blog/284193 摘要: 静态库文件可以有效的将功能封装和细节隐藏 ios 静态库 static lib ...
- ios中静态库的创建和使用、制作通用静态库(Cocoa Touch Static Library)
创建静态库可能出于以下几个理由: 1.你想将工具类代码或者第三方插件快捷的分享给其他人而无需拷贝大量文件.2.你想让一些通用代码处于自己的掌控之下,以便于修复和升级.3.你想将库共享给其他人,但不想让 ...
- iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a以及 FrameWork 的创建
armv7,armv7s,arm64,i386,x86_64 详解 一.概要 平时项目开发中,可能使用第三方提供的静态库.a,如果.a提供方技术不成熟,使用的时候就会出现问题,例如: 在真机上编译报错 ...
- VC win32 static library静态链接库简单示例
中午在宿舍闲来没事,看到网上一篇帖子,关于静态链接库的英文示例.它在.Net上开发,我将其移到VC上开发,因此对其代码做了相应修改.帖子内容如下:(代码我已修改).原帖见:http://msdn.mi ...
- Xcode 创建静态库和动态库
1.linux中静态库和动态库区别: 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库:这类库的名字一般是libxxx.a:利用静态函数库编译成的文件 ...
随机推荐
- 如何在sublime+chrome中调试php代码?
1.搭建php本地运行环境具体点击如何使用phpstudy本地搭建多站点(每个站点对应不同的端口) 2.下载php_xdebug.dll, [5.3版以上的php下载地址]http://pecl.ph ...
- Java课程设计——博客作业教学数据分析系统(201521123084 林正晟)
#课程设计--博客作业教学数据分析系统(201521123084 林正晟) 1.团队课程设计博客链接 博客作业教学数据分析系统 2.个人负责模块或任务说明 学生登陆界面的前端实现和与数据库的连接 学生 ...
- 学号:201521123116 《java程序设计》第五周学习总结
1. 本章学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 不能编 ...
- 201521123006 《Java程序设计》 第2周学习总结
1. 本周学习总结 本周进一步学习了java,了解了java编程中一些特定的用法,比如:在编译程序时可以使用import来减少输入包名称.本周还学会了使用枚举类(enum Choice{fab,sor ...
- 201521123040《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...
- 201521123051《Java程序设计》第十周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...
- linux(4) vi编辑/删除、复制、粘贴 /bash shell 环境变量设置/数据流重定向 | 的用法
一.vi文字处理器1.vi与vimvi:文字处理器vim:程序开发工具2.vi介绍三种模式:一般模式(vi刚进入的,不可编辑),编辑模式(按i后,左下方是insert)和命令行模式(按esc退出,:w ...
- Spring - bean的lazy-init属性(懒加载)
默认情况下,容器初始化的时候便会把bean实例化,通常这样做可以让一些配置或者bean实例化的异常在容器启动的时候就发现,而不是在N久之后.但有时候,我们希望某个可能不会用到但又不是100%不用的be ...
- JVM菜鸟进阶高手之路十二(jdk9、JVM方面变化, 蹭热度)
转载请注明原创出处,谢谢! 经过 4 次跳票,历经曲折的 Java 9 正式版终于发布了!今天看着到处都是jdk9发布了,新特性说明,心想这么好的蹭热度计划能错过嘛,哈哈,所以就发了这篇文章. 目前j ...
- PostgreSQL使用MyBatis,insert时返回主键
MyBatis中普通的insert语句是这样的: <insert id="insert" parameterType="com.xxx.xxx.xxDo" ...