使用 Xcode 5 生成和使用静态库

来源:互联网 发布:mysql 5.5 for mac 编辑:程序博客网 时间:2024/05/17 23:39

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

Download Demo

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 中使用自定义的静态库

Download Demo

1、创建一个 workspace;


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


3、构建此静态库文件。

我创建了一个 Person 类和一个 NSString 的 Category(NSString+TempCategory),代码结构如下:

Person.h
@interface Person : NSObject- (void)ask;@end
Person.m
#import "Person.h"#import "NSString+TempCategory.h"@implementation Person- (void)ask{    [NSString sayLove];}@end

NSString+TempCategory.h

@interface NSString (TempCategory)+ (void)sayLove;@end
NSString+TempCategory.m
#import "NSString+TempCategory.h"@implementation NSString (TempCategory)+ (void)sayLove{    NSLog(@"I love U");}@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 了。




0 0