【第22期】观点:IT 行业加班,到底有没有价值?

创建静态库static library

转载 2015年11月21日 18:50:41

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

简介:

库是一些没有main函数的程序代码集合。除了静态库,还有动态链接库,他们之间的区别是:静态库可以编译到我们的执行代码中,应用程序可以在没有静态库的环境中运行;动态库不能编译到我们的执行代码中,应用程序必须在有链接库文件的环境下运行。

创建静态库的步骤如下所示,

1、创建Static Library,新建->Project,选择Static Library,如图,

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

2、静态库文件功能的实现细节

创建了静态库Static Library项目之后,Xcode自动为我们创建了TimeDate.h/.m文件,如下图所示,

这时候我们需要在这里面填充一些细节,这里,我想要实现的功能就是将时间戳NSTimeInterval转换成NSString的功能,那么代码的细节如下所示,

TimeDate.h文件

?
1
2
3
@interface TimeDate : NSObject
- (NSString *)changeToStandardTime:(NSTimeInterval)timeInterval;
@end

TimeDate.m文件

?
1
2
3
4
5
6
7
8
9
10
11
#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文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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真机程序,所以可以选择不合并静态库,直接使用真机编译生成的静态库文件进行开发,没有必要为了兼容模拟器而合并静态库文件。当然,如果有强迫症或者公司设备不够,那么还是合并静态库文件吧。

感想:很早就想总结一下静态库的东西,但是感觉没有必要,也不知道怎么系统的总结。最近项目中,发现老大对于项目依赖关系处理的很牛逼,我很羡慕。如果我想达到他那样的水平,必须从头开始好好了解,而这第一步基本就是静态库方面的东西,所以必须走好第一步。这篇博客也算是我写项目依赖关系博客的前奏,后面我会更加深入的记录我自己对于项目管理方面的一些理解,希望对读者有所帮助。

举报

相关文章推荐

vs2010 静态库以及动态库编译实例

最近在研究ffmpeg,所以想

vs2013创建静态库并使用静态库

A:首先要生产成静态库1.. 创建工程——win32项目 My_Static_lib_1 2.. 选择静态库,预编译头和安全开发生命周期(SDL)检查可要也可不要,我们这里选择不要 3...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

用VS2010创建与应用新的静态库

用VS2010中文旗舰版创建及应用新的静态库项目 创建新的静态库 1.在“文件”菜单中,选择“新建”然后选择“项目...”。 2.在“项目类型”窗格中,选择“Visual C++”下的“Win3...

2-静态库的创建和使用

1. 创建静态库 d => 从归档文件中删除文件 m[ab] => 在归档文件中移动文件 p => 打印在归档文件中找到的文件 q[f] => 将文件快速追加到归档文件中 r[ab]...

VS2010下创建静态链接库和动态链接库

下面介绍一下用VS2010如何创建静态链接库和动态链接库,并测试创建的库。 1.静态链接库 打开VS2010,新建一个项目,选择win32项目,点击确定,选择静态库这个选项,预编译头文件可选可不选...

Xcode7 中创建静态库:.a 和 .framework(一)

本文是根据项目中使用的静态库来总结下如何创建.a和.framework两种静态库,具体关于两种静态库的区别就不在这里进行介绍了 .a静态库创建的步骤说明 1.新建项目,点击iOS->Fram...

VS2012创建静态库(Win32)

1、 2、 3、 4、 5、

VS实现静态库的创建和使用

步骤1: 新建一个空项目,输入项目名称。例如sharememory 步骤2: 右击“头文件”,选择“添加”—> “现有项”   从存放项目文件的目录中找到ldsrcinf.h,lds...

静态库和动态库的创建和使用

windows下静态库创建和使用 静态库的创建 1. 创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入staticlib。点击确定。 2.在解决...

iOS 创建静态库(.a)

本文由 Migrant [博客]翻译自 Creating a Static Library in iOS Tutorial。   如果您有不错的原创或译文,欢迎提交给我们,更欢迎其他朋友加入我们的翻...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)