使用 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的平台不同( ...
随机推荐
- [置顶]
kubernetes--Init Container
概念 Init Container就是做初始化工作的容器.可以有一个或多个,如果有多个,这些 Init Container 按照定义的顺序依次执行,只有所有的InitContainer 执行完后,主容 ...
- ISP模块之彩色图像增强--ACE算法 .
ACE(Automatic Color Enhancement),自动色彩增强算法,是一种对于彩色图像增强十分行之有效的方法.它的改进算法以及快速实现在文章Automatic Color Enhanc ...
- 浅谈C#委托和事件(转载)
委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本 ...
- spring boot 缺点优点?
作者:八面山人链接:https://www.zhihu.com/question/39483566/answer/246333825来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- 面试——谈谈对JAVA的理解
谈谈你对Java平台的理解.答:Java首先是一种面向对象的语言,语言特性有封装,继承,多态,泛型,Lamda表达式等; 第二个特性:支持跨平台,一次书写导出运行(write once,run any ...
- 2017.8.4 Creating Server TCP listening socket *:6379: bind: No such file or directory
启动redis时出现如下错误: 解决办法:按顺序输入如下命令就可以连接成功. 1. redis-cli.exe 2. shutdown 3. exit 4. redis-server.exe 参考来 ...
- 一个对比各种开源库的网站 libhunt
https://www.libhunt.com/ https://github.com/LibHunt/awesome-javascript
- NeatBean下ssh 私钥格式问题
1. SecureCRT 生成的private key 的格式是其私有的格式, 2. 标准格式为 openssl 格式
- Java模式的秘密--java常用的几种模式
要学习设计模式,首先要明白设计模式,就是为实现某一种或某一组功能提供的代码编码方式.它没有固定的套路,只有约定俗成的风格.所有编码者可以根据已有的设计模式开放思维,设计出自己的设计模式,也会在无意中使 ...
- WebView简单使用
public class MainActivity extends Activity { WebView webView; @Override protected void onCreate(Bund ...