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


     
    本文转载至 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.   
    3. - (void)ask;  
    4.   
    5. @end  
    Person.m
    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

    1. @interface NSString (TempCategory)  
    2.   
    3. + (void)sayLove;  
    4.   
    5. @end  
    NSString+TempCategory.m
    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 了。

  • 相关阅读:
    机器学习-线性回归
    机器学习-朴素贝叶斯
    ML-first project
    机器学习-决策树
    当矩阵的秩小于未知数的个数时,方程组有无数个解;当矩阵的秩等于未知数的个数时,方程组只有零解。
    并发编程futuretask
    Java重头学
    InputString 转换成 BufferedImage 和 byte[]
    mysql批量更新
    关于ajax请求数据,并将数据赋值给全局变量的一些解决方法
  • 原文地址:https://www.cnblogs.com/Camier-myNiuer/p/3668889.html
Copyright © 2020-2023  润新知