iOS开发之静态库.a 以及合并

静态库和动态库

静态库和动态库的存在形式
静态库: .a 和 .framework

动态库: .dylib 和 .framework

静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中, 被多次使用就有多份冗余拷贝

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存

 

制作 .a

新建项目-> 选择 “Cocoa Touch Static Library”

就在.h文件中,写入功能函数!简单的直接写入1个方法,并实现方法,例子是把输入的字符串打印两边

#import <Foundation/Foundation.h>

@interface MyStaticLibraryDM : NSObject

//将输入的字符串打印两边
-(void)printMyInput:(NSString*)inputString;

@end
#import "MyStaticLibraryDM.h"

@implementation MyStaticLibraryDM

-(void)printMyInput:(NSString*)inputString{

    NSLog(@"inputString === %@ twice is ==== %@",inputString,inputString);
}

@end

然后,调试代码无误后,就可以进行编译了

 

编译静态库

注意:需要修改Build Settings中的 Build Active Architecture Only 以满足运行不同CPU环境的模拟器。 将此设置为NO。

在不同编译环境下编译会生成四种静态库,debug模拟器,debug真机,release模拟器,release真机,我们需要将运行环境调至不同的状态并生成如上四种形式的静态库。这里只以一种情况为例:
设置是Debug还是release
选择Edit Scheme--> Buid Configuration设置为release
设置模拟器还是真机
就是设置模拟器还是真机,因为之前我们将只编译当前环境设置为NO,所以编译出来的静态库会支持各种CPU环境。

最后按住 command+b 编译!

你会发现你的静态库文件从红色变成了黑色,这就是编译完成了啊。可以 show in finder 查看文件所在位置。

上面是我在不同环境运行之后的结果

Debug-iphoneos 文件夹里面的东西是用在真机上的
Debug-iphonesimulator 文件夹里面的东西是用在模拟器上的

其他是在Release模式环境生成的 

 

如果想让一个 .a 文件能同时用在真机和模拟器上,需要进行合并
在终端输入指令

lipo -create 静态库1 静态库2 -output 新静态库名称.a
localhost:~ micaimanong$ cd /Users/micaimanong/Library/Developer/Xcode/DerivedData/MyStaticLibraryDM-fczwjaefnkvdmjelggxccgpicgwy/Build/Products 
localhost:Products micaimanong$ lipo
-create Debug-iphoneos/libMyStaticLibraryDM.a Debug-iphonesimulator/libMyStaticLibraryDM.a -output libMyStaticLibraryDM.a

先进入products 在将其中的两个合并 合并之后生成一个新的.a文件 

 

如下图所示 libMyStaticLibraryDM.a 支持模拟器和真机

 

 

最后就是引用了

在你的要使用太静态库的项目中导入libMyStaticLibraryDM.a文件和include文件夹中的相应的所有.h头文件。
 
例如,我要在MyLibraryTest项目中,使用我上述编译好的静态库文件。
 
导入完成后,项目如下:
 

之后引用文件并实现方法

打印如下 将输入的字符串打印了两边

 

如果遇到下面的问题

原因是你导入错误的编译版本。
以上错误,是你的库文件(.a)为真机版本,你却用模拟器来调试程序。将调试目标换成真机,或者使用合并之后的(.a)文件也可以解决。

操作时会遇到很多问题,具体问题具体对待。

posted on 2017-03-02 10:50  Left-knife  阅读(3373)  评论(0编辑  收藏  举报

导航