本文转载至 http://blog.csdn.net/qq331436155/article/details/18363267
 
 

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

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
  1. @interface Person : NSObject
  2. - (void)ask;
  3. @end

Person.m

  1. #import "Person.h"
  2. #import "NSString+TempCategory.h"
  3. @implementation Person
  4. - (void)ask
  5. {
  6. [NSString sayLove];
  7. }
  8. @end

NSString+TempCategory.h

  1. @interface NSString (TempCategory)
  2. + (void)sayLove;
  3. @end

NSString+TempCategory.m

  1. #import "NSString+TempCategory.h"
  2. @implementation NSString (TempCategory)
  3. + (void)sayLove
  4. {
  5. NSLog(@"I love U");
  6. }
  7. @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 了。

最新文章

  1. js模块化方案【转】
  2. Python基础(七)内置函数
  3. 避免JS全局变量冲突
  4. [Javascript] Writing conventional commits with commitizen
  5. ubunt 基于deb 配置本地apt 源 分成仅本机使用,局域网使用2种
  6. [Angular 2] Simple intro Http
  7. 【转】网络视频监控P2P解决方案
  8. 介绍几种IC卡
  9. ASP.NET之.NET FrameWork框架
  10. 如何用PHP遍历文件数目 或删除目录下的全部文件?
  11. idea的debug调试快捷键
  12. 前端必须收藏的CSS3动效库!!!
  13. git push 报错 "Peer certificate cannot be authenticated with known CA certificates"
  14. C#从SqlServer数据库读写文件源码
  15. 查看安装的react-native和react版本
  16. QT下opencv的编译和使用
  17. spring集成mybatis的mybatis参考配置
  18. JS库汇总[重要]
  19. react入门-refs
  20. Python day20正则表达式和re方法

热门文章

  1. java 中的VO,PO,DTO,DO对象
  2. [置顶] Python+Django 复选框选择多个 提交只能保存单个
  3. log4j教程 5、示例程序
  4. 第三章,设置button边框(Android)
  5. iOS 设置导航栏 返回按钮文字隐藏
  6. ejs - 初试
  7. 测试代码覆盖率工具学习(Android Emma)
  8. eclipse中代码没错但项目名称有个小红X
  9. android端StarIO热敏打印机打印小票
  10. Android实践--监測网络状态