在项目中使用打包的静态库

1、创建静态库文件

步骤1:创建新项目,选择 "Framework & Library" --> "Cocoa Touch Static Library" --> "Next";

步骤2:填写信息,在这里我填写 Product Name 为 "TempLib",然后点“Next”;

步骤3:选择保存的位置后点"Create";

步骤4:创建成功后,会自动生成一个跟项目名同名的类文件。在类文件中创建一个测试方法,并在 .h 文件中声明;

步骤5:设置需要公开的头文件。"TARGETS" --> "Build Phases" --> "Copy Files",点击加号就可以添加公开的头文件了。只有公开的头文件才能被外部使用,如果只是静态库内部自己使用的类是不用公开的。在编译时 Xcode 会把公开的 .h 文件做一份copy, "Destination"和"Subpath"就是用来设置拷贝到的目标路径。

步骤6:接下来是打包静态库,其实编译完成的同时静态库也打包完成了。需要注意的是,编译分为对 iOS Device 编译和对 iOS Simulator 进行编译,两者是不同的,不能通用,如果两种情况都需支持,得分别进行编译。如果针对模拟器编译后,项目目录下生成的 .a 文件为红色,如果是针对 iOS Device 进行的编译 .a 文件会变成黑色,看下图。当 .a 文件变黑之后,可以右击 .a 文件来查看在 Finder 中的位置。也可以设置生成 .a 文件的路径,见下面第二张图,不过一般不做修改。

步骤7:最后一步就是提取 lib 文件和公开的 .h 文件,方便之后使用。如图,分别在"Debug-iphoneos"和"Debug-iphonesimulator"目录中找到 .a 文件,文件如果没有主动设置公开头文件生成的路径,默认目录会在与 .a 文件同级目录的"include/项目名/*.h"。

2、使用静态库

将静态库和 .h 头文件直接拖到项目中即可以使用,下面是测试结果。

 

 

在 workspace 中使用自定义的静态库

1、创建一个 workspace;

2、在 Project Navigator 中右击,选择"New Project...",新建一个 Static Library,取名为"TempLib";

3、构建此静态库文件。

我创建了一个 Person 类和一个 NSString 的 Category(NSString+TempCategory),代码结构如下:
 
Person.h
[objc] view plaincopy
  1. @interface Person : NSObject  
  2.   
  3. - (void)ask;  
  4.   
  5. @end  
Person.m
[objc] view plaincopy
  1. #import "Person.h"  
  2. #import "NSString+TempCategory.h"  
  3.   
  4. @implementation Person  
  5.   
  6. - (void)ask  
  7. {  
  8.     [NSString sayLove];  
  9. }  
  10.   
  11. @end  

NSString+TempCategory.h

[objc] view plaincopy
  1. @interface NSString (TempCategory)  
  2.   
  3. + (void)sayLove;  
  4.   
  5. @end  
NSString+TempCategory.m
[objc] view plaincopy
  1. #import "NSString+TempCategory.h"  
  2.   
  3. @implementation NSString (TempCategory)  
  4.   
  5. + (void)sayLove  
  6. {  
  7.     NSLog(@"I love U");  
  8. }  
  9.   
  10. @end  

4、选择需公开的头文件。我只想公开 Person 类,所有操作如下;

5、编译。分别选择 iOS Device 和 Simulator 进行编译。

6、同样在左侧 Project Navigator 区右击-->"New Project...",我们为了方便测试,新建一个"Empty Application",起名为“Demo”;

 

7、导入静态库。“TARGETS”-->"Demo"-->"Build Phases"-->"Link Binary With Libraries",点加号后选中"libTempLib.a"-->“Add”;

8、打开 Demo 项目中的 "AppDelegate.m" 文件,导入“Person.h”,编译会出错(注意需要手动切换Scheme),提示“‘Person’ file not found”。现在虽然已经导入了静态库文件,但依然无法使用"Person"类。这是因为系统无法找到“Person.h”文件,需要手动设置静态库提供的头文件路径。找到下图中的“User Header Search Paths”,双击添加“$(BUILT_PRODUCTS_DIR)/include”并在后边选择"recursive",点空白处保存;

9、现在就可以正常导入静态库提供的头文件了。在 AppDelegate.m 文件中添加以下代码来进行测试;

10、编译正常,当 Run 时发现程序 crash ,提示如下图。根据提示在调用[NSString sayLove]时发生错误,我们知道 sayLove 方法是我们在 lib 中为 NSString 添加的一个 Category 。了解错误的原因需查看一下苹果提示的一份文档:传送门 ,大意是:由于链接问题无法找到类别,需要在你项目的"Other Linker Flags"中添加“-ObjC”,一定要注意大小写,见下方第二张图。

11、重新 Run ,发现已经 OK 了。







最后是关键步骤: 

通过lipo -create 命令来合并2个静态库文件。(-output 后面的/Users/cash/Desktop/test/libMtimeLibrary.a 是合并后的路径和文件名字) 

lipo -create "/Users/cash/Library/Developer/Xcode/DerivedData/MtimeLibrary-amyqbnwwzcivnyeijggzaorseihj/Build/Products/Debug-iphonesimulator/libMtimeLibrary.a" "/Users/cash/Library/Developer/Xcode/DerivedData/MtimeLibrary-amyqbnwwzcivnyeijggzaorseihj/Build/Products/Debug-iphoneos/libMtimeLibrary.a" -output "/Users/cash/Desktop/test/libMtimeLibrary.a"   
成功! 

最后通过命令 lipo -info libMtimeLibrary.a  可以知道这个文件已经有i386和armv7信息了。 
cashmatoMacBook-Pro:test cash$ lipo -info libMtimeLibrary.a 
Architectures in the fat file: libMtimeLibrary.a are: i386 armv7 
cashmatoMacBook-Pro:test cash$ 


//银联合并成通用静态库 
lipo -create "/Users/cash/Desktop/iphonesimulator/upomp_bypay/lib/libUPOMP.a" "/Users/cash/Desktop/iphoneos/upomp_bypay/lib/libUPOMP.a" -output "/Users/cash/Desktop/test/libUPOMP.a"   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值