使用 Xcode 5 生成和使用静态库
在项目中使用打包的静态库
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、构建此静态库文件。
- @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 了。
使用 Xcode 5 生成和使用静态库的更多相关文章
- 生成lua的静态库.动态库.lua.exe和luac.exe
前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...
- Android NDK生成及连接静态库与动态库
对于Android应用开发,大部分情况下我们使用Java就能完整地实现一个应用.但是在某些情况下,我们需要借助C/C++来写JNI本地代码.比如,在使用跨平台的第三方库的时候:为了提升密集计算性能的时 ...
- Xcode 创建.a和framework静态库(转载)
库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framew ...
- 经验分享:Xcode 创建.a和framework静态库【转】
作者:Haley_Wong 最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态 ...
- Xcode 创建.a和framework静态库
库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framew ...
- IOS 在Xcode 4.x以上添加静态库
参考网站:http://my.oschina.net/edwardlau/blog/95924 常用的代码可以通过静态库进行抽出来作为公共类方法,方便在其他地方调用,一般来说我们要准备2套静态库,一套 ...
- 经验分享:Xcode 创建.a和framework静态库
最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的 ...
- Xcode 创建.a和framework静态库(转)
最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.iOS中的静 ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
随机推荐
- 推荐一款Java反编译器,比较好用
转自:http://www.blogjava.net/xmatthew/archive/2008/10/28/237203.html 推荐一款Java反编译器,也使用了挺久的了,感觉还是很好用,就拿出 ...
- wsdl2java在mac中点配置
1.打开终端,默认是用户目录,输入以下命令: ls -a 显示隐藏文件 2.打开.bash_profile,输入以下命令 open .bash_profile 配置JAVA_HOME,AXIS2_HO ...
- [Java] 实验8
[Java] 实验7參考代码,代码已更新.感兴趣的同学能够去学习. 1. default package问题可參考实验6 2. for, if, while等.后面包括多条语句时,须要用花括号括起来 ...
- 代码验证C#执行”文件打开关闭操作“耗时
2017-04-19 部门经理习惯用C#做数据清洗,遇到个需要验证的问题,在一个万次左右循环内对文件执行打开关闭操作,比在循环前打开文件.循环后关闭文件耗时多多少. using System; usi ...
- 2017.3.31 spring mvc教程(六)转发、重定向、ajax请求
学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...
- 2016.6.20 tomcat端口始终被占用
我在使用tomcat7时,服务开启时,始终提示端口被占用. 但是从进程中又看不到开启的tomcat. 最后在资源监视器中,结束重复开启的tomcat. (注意是资源监视器,刚开始的时候看成管理器,怎么 ...
- C#.NET为List加入扩展方法:获取唯一值
public static class ListTools { /// <summary> /// 获取唯一值列表 /// </summary> /// <param n ...
- iOS学习笔记之蓝牙(有关蓝牙设备mac地址处理)
原文: http://blog.sina.com.cn/s/blog_6f2f0bed0102xn0e.html
- JavaScript变量提升 面试题
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- git统计代码行数
查看个人指定时期内代码行数,注意将 --author="user.name" 替换成自己的用户名 git log --since="2018-07-16" -- ...