静态库的创建和使用,制作通用静态库

Posted 菁欣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态库的创建和使用,制作通用静态库相关的知识,希望对你有一定的参考价值。

  如果你作为ios开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用。重用代码的最简单方法是简单的拷贝、粘贴源文件。然而,这种方法很快就会成为维护时的噩梦。因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步。这就是静态库要拯救你的。一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享。

创建静态库可能出于以下几个理由:
1.你想将一些你和你团队中的同事们经常使用的类打包并轻松的分享给周围其他人。
2.你想让一些通用代码处于自己的掌控之下,以便于修复和升级。
3.你想将库共享给其他人,但不想让他们看到你的源代码。

一、创建静态库文件

打开Xcode, 选择File -> New -> Project。 新建工程。选择iOS -> Framework & Library -> Cocoa Touch Static Library。点击Next。创建工程,命名JXStaticLibTest

工程目录:

删除掉默认的.h, .m文件,添加自己的工具类文件

#import <Foundation/Foundation.h>

@interface testOne : NSObject
-(void)testOne;
@end
#import "testOne.h"

@implementation testOne
-(void)testOne {
    NSLog(@"testOne,,,,,,,,");
}
@end
#import <Foundation/Foundation.h>

@interface testTwo : NSObject
- (void)testTwo;
@end
#import "testTwo.h"

@implementation testTwo
- (void)testTwo {
    NSLog(@"testTwo.........");
}
@end
#ifndef Header_h
#define Header_h

#import "testOne.h"
#import "testTwo.h"

#endif /* Header_h */

把上面的工具类编译成.a静态库,实际上就是把.m文件编译成静态库,头文件.h暴露出去,否则别人拿着静态库是无法使用的,显示头文件找不到,所以需要在工程内修改配置,修改copy Files

 

二、创建通用静态库

先了解下,iOS模拟器和真机设备对应的CPU架构

模拟器:

4s-5: i386

5s-8 Plus、iPhone X、iPhone SE: x86_64

真机(iOS设备):

armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)       

armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2

armv7s: iPhone 5、iPhone 5c (静态库只要支持了armv7,就可以在armv7s的架构上运行)

arm64(注:无armv64): iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、 iPhone 7 、iPhone 7 Plus、iPhone 8 、iPhone 8 Plus、iPhone X、iPhone SE、iPad Air、iPad Air2、iPad mini2、iPad mini3、iPad mini4、iPad Pro

通过xcode编译出的静态库.a文件因为支持的cpu架构不同而分为不同的版本,各个版本的.a文件不能混用,为了解决这个问题需要制作通用的静态库文件 

注意::模拟器静态库只能运行在模拟器上而真机静态库也只能运行在真机上,这样就比较麻烦,通过下面的步骤将两个静态库合成一个,这样在模拟器和真机上都能用了。 

1、模拟器静态库:使用iOS Simulators -> iPhoneX在Products目录下生成libJXStaticLibTest.a文件(文件名从红色变为黑色既为编译成功)

2、真机静态库: 使用iOS Device -> iPhone7P(测试设备)在Products目录下生成libJXStaticLibTest.a文件(文件名从红色变为黑色既为编译成功)

            

3、通过右键.a文件->show in finder 找到文件编译成功之后的两份libJXStaticLib.a,并且留着include文件夹以备用

4、使用mac下的终端命令行工具执行合并语句

lipo -create /Users/xywy/Library/Developer/Xcode/DerivedData/JXStaticLibTest-aptwdopkadecxzeivsypnsizkibi/Build/Products/Debug-iphoneos/libJXStaticLibTest.a /Users/xywy/Library/Developer/Xcode/DerivedData/JXStaticLibTest-aptwdopkadecxzeivsypnsizkibi/Build/Products/Debug-iphonesimulator/libJXStaticLibTest.a -output /Users/xywy/Desktop/libJXStaticTest.a

 解释:三个文件路径都用空格分开,/Users/xywy/Desktop/libJXStaticTest.a既为生成的通用静态库文件

 如果你不知道每个.a文件支持的系统,可以通过lipo -info命令行来查看具体信息,正好验证我们前面所操作的

如果需要将通用静态库分离成各个版本的静态库,可以参考文章 http://www.cnblogs.com/wengzilin/p/3800856.html

 

三、使用静态库

新建一个ios项目,并创建lib文件夹,将之前操作中的include文件夹和通用静态库libJXStaticTest.a文件加入,在需要的地方导入头文件,调用方法

 

这就大功告成了!!!

 

新增更全学习链接:https://www.cnblogs.com/richard-youth/p/4856841.html

以上是关于静态库的创建和使用,制作通用静态库的主要内容,如果未能解决你的问题,请参考以下文章

Linux 静态库和共享(动态)库的创建与使用详解

静态库的制作和使用

.a静态库的制作及使用

静态函数库的制作和使用

IOS 静态库的和.framework制作

动态库和静态库的区别