本文转载至 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 了。

使用 Xcode 5 生成和使用静态库的更多相关文章

  1. 生成lua的静态库.动态库.lua.exe和luac.exe

    前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...

  2. Android NDK生成及连接静态库与动态库

    对于Android应用开发,大部分情况下我们使用Java就能完整地实现一个应用.但是在某些情况下,我们需要借助C/C++来写JNI本地代码.比如,在使用跨平台的第三方库的时候:为了提升密集计算性能的时 ...

  3. Xcode 创建.a和framework静态库(转载)

    库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framew ...

  4. 经验分享:Xcode 创建.a和framework静态库【转】

    作者:Haley_Wong 最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态 ...

  5. Xcode 创建.a和framework静态库

    库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framew ...

  6. IOS 在Xcode 4.x以上添加静态库

    参考网站:http://my.oschina.net/edwardlau/blog/95924 常用的代码可以通过静态库进行抽出来作为公共类方法,方便在其他地方调用,一般来说我们要准备2套静态库,一套 ...

  7. 经验分享:Xcode 创建.a和framework静态库

    最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的 ...

  8. Xcode 创建.a和framework静态库(转)

    最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.iOS中的静 ...

  9. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

随机推荐

  1. Scala各种符号含义;scala =>符号含义总结

    符号: <- :for循环 -> :map映射 => :匿名函数 Int= :scala函数 _ :通配符 https://blog.csdn.net/bon_mot/article ...

  2. boost/config.hpp文件详解

    简要概述 今天突发奇想想看一下boost/config.hpp的内部实现,以及他有哪些功能. 这个头文件都有一个类似的结构,先包含一个头文件,假设为头文件1,然后包含这个头文 件中定义的宏.对于头文件 ...

  3. 转: javascript技术栈

    http://www.infoq.com/cn/articles/state-of-javascript-2016

  4. [PWA] Access the Camera in a PWA built with React

    It's possible to access some, but not all, of the native device features from a PWA. One that we can ...

  5. mysql误操作后通过binlog恢复,同时解决tmp目录满的问题

    注意: 本文的恢复,并不是基于恢复某个时间点的全量备份后的增量恢复,而是指在现有数据库基础上基于binlog的恢复.适用于较小的数据误操作. 提取日志文件为sql语句: /usr-ext/local/ ...

  6. python——内置对象

    python的内置对象 对象类型 常量示例/用法 Number(数字) 3.14159, 1234, 999L 3+4j String(字符串) 'spam', "guido's" ...

  7. SVN遇到Can't convert string from 'UTF-8' to native encoding(转)

    svn: Can't convert string from 'UTF-8' to native encoding: svn: platform/console-framework/portal/im ...

  8. 打造Android万能上拉下拉刷新框架--XRefreshView(三)

    转载请注明出处:http://blog.csdn.net/footballclub/ 打造Android万能上拉下拉刷新框架–XRefreshView(一) 打造Android万能上拉下拉刷新框架–X ...

  9. Effective C++ Item 34 区分接口继承与实现继承

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 关联条款 Item 36 接口继承和实现继承不同.在 public 继承下, derived ...

  10. 篇章一:[AngularJS] 使用AngularAMD動態載入Controller

    前言 使用AngularJS來開發Single Page Application(SPA)的時候,可以選用AngularUI Router來提供頁面內容切換的功能.但是在UI Router的使用情景裡 ...