深入理解iPhone静态库(手把手教你iphone开发 - 基础篇)

作者:孙东风 2009-11-20(请尊重作者劳动成果,转载务必注明出处)

在实际的编程过程中,通常会把一些公用函数制成函数库,供其它程序使用,一则提搞了代码的复用;二则提搞了核心技术的保密程度。所以在实际的项目开发中,经常会使用到函数库,函数库分为静态库和动态库两种。和多数人所熟悉的动态语言和静态语言一样,这里的所谓静态和动态是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

iPhone官方只支持静态库联编,本文就以静态库为例讲解iPhone中静态库的具体用法。在实际的开发过程中,可能在项目设计阶段把一些功能比如图形界面引擎、网络通讯引擎等都规划到相应的函数库中。

打开XCode新建一个项目,选择Library下的“Cocoa Touch Static Library”并命名为“FirstLibrary”。这个新建的静态库项目下除了“FisrtLibrary_Prefix.pch”外没有任何程序文件,在Classes文件夹上点右键选择“New File…”,然后在“Cocoa Touch Class”下选择“Objective-C class”,笔者在这里先创建Objective-C风格的源文件和头文件并命名为“function”,可以看到在Classes目录下产生了function.h和function.m文件。接着在头文件里输入以下内容:

#import <Foundation/Foundation.h>

@interface function : NSObject {

}

- (int)getMax:(int)a b:(int)b;

- (int)getMin:(int)a b:(int)b;

@end

实现文件function.m内容如下:

#import "function.h"

@implementation function

- (int)getMax:(int)a b:(int)b

{

return a > a?a:b;

}

- (int)getMin:(int)a b:(int)b

{

return a < b?a:b;

}

@end

可见,笔者的这个静态函数库的功能很简单,就是提供了两个获取最大值和最小值的函数。但是可能大多数现存的函数库的源码都是C或者C++格式的,没关系,iPhone对C/C++支持的也很好。在Classes文件夹上点右键,选择“New File…”,这次选择Mac OS X下的“C and C++”,之后选择“C File”并命名为“TestCFunction”,可以看到在Classes目录下产生了两个文件“TestCFunction.h”和“TestCFunction.c”,TestCFunction.h如下:

#ifndef TestCFunction_H_

#define TestCFunction_H_

void swapValue(int* a,int* b)

{

int temp = 0;

temp = *a;

*a = *b;

*b = temp;

}

#endif

TestCFunction.c文件内保持为原样。

至此,这个静态函数库已经编写完毕,尽管很简单,但是包含了Objective-C风格和C风格的源代码文件在内,编译这个程序会看到在Products目录下产生了名为“libFirstLibrary.a”的静态库文件。

新建一个“Window-based Application”项目并命名为“FirstLibraryTest”,下面笔者会演示如何在这个新项目里利用前面生成的静态库libFristLibrary.a文件。

¨         首先,拖拉静态库里的“FirstLibrary.xcodeproj”文件到新项目的Frameworks目录下(当然也可以通过右键点Frameworks->Add->Existing Files..添加),如下图:

然后选择“FristLibrary.xcodeproj”文件,选择右边编辑窗口中的最后一项,这样就将静态库添加到项目中了,如下图:

在将静态库添加到项目中后,需要在项目和静态库之间建立“Direct Dependencies(所谓的依赖关系)”。在“Targets”目录下选择“FirstLibraryTest”,然后快捷键Cmd+i(或者右键选择Get Info)可以看到项目的依赖信息,如下图:

点击“Direct Dependencies”下方的“+”按钮,会出现下图:

选择“FirstLibrary”并点击“Add Target”,这样就建立了项目和静态库之间的“依赖关系”,在项目编译阶段,程序会到静态库中查找相应的目标文件。

¨         接下来使用静态库中的函数,修改头文件FirstLibraryTestAppDelegate.h如下:

#import <UIKit/UIKit.h>

#import "function.h"

#include "TestCFunction.h"

@interface FirstLibraryTestAppDelegate : NSObject <UIApplicationDelegate> {

UIWindow *window;

function* iFunc;

}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

修改相应的实现文件如下:

#import "FirstLibraryTestAppDelegate.h"

@implementation FirstLibraryTestAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(UIApplication *)application {

iFunc = [[function alloc] init];

int a = 3,b = 6;

int max = 0,min = 0;

max = [iFunc getMax:a b:b];

min = [iFunc getMin:a b:b];

NSLog(@"max = %d,min = %d",max,min);

int c = 8,d = 22;

swapValue(&c, &d);

NSLog(@"after swapValue c = %d,d = %d",c,d);

// Override point for customization after application launch

[window makeKeyAndVisible];

}

- (void)dealloc {

[window release];

[super dealloc];

}

@end

编译下,会发现项目无法编译通过,错误信息如下:

error: function.h: No such file or directory

就是说,项目无法找到相应的静态库的头文件,从而也就无法在项目和静态库之间建立“依赖关系”,所以需要在项目的“依赖信息选项”里告诉项目它所依赖的静态库头文件的位置信息,如下图设置静态库头文件的位置信息:

最后再编译一下,顺利通过,输出信息如下:

[Session started at 2009-11-20 10:52:22 +0800.]

2009-11-20 10:52:23.805 FirstLibraryTest[768:207] max = 6,min = 3

2009-11-20 10:52:23.807 FirstLibraryTest[768:207] after swapValue c = 22,d = 8

有时候程序会出现如下错误信息:

这是因为在静态库里使用了Objective-C风格的源文件,需要在项目的“依赖关系信息项”里设置如下:

添加内容项为“-ObjC”。

iPhone:创建、连接和使用静态库(过时了,仅参考)相关推荐

  1. 创建制作SDK的静态库工程

    因为公司需要持续性向别人提供一套蓝牙锁SDK,按照传统的方式打包静态库真是太痛苦,SDK依赖的一些私有库会有频繁的更新,依赖的第三方库也是错综复杂.我迫切需要找到一种更方便的打包静态库的方式,既能随时 ...

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

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

  3. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  4. 静态库和动态库的创建与使用

    @[TOC](静态库和动态库 1.什么是静态库和动态库 1.1静态库 1.2动态库 2.静态库的创建及使用(c++用g++) 3.动态库的创建与使用 4.静态库和动态库(共享库)的区别 参考 1.什么 ...

  5. XCode 创建:静态库 动态库 Framework

    目录 使用 XCode 创建 .a 格式的静态库 使用 XCode 创建 .framework 格式的静态库 使用 XCode 创建 .dylib 格式的动态库 使用 XCode 创建 .framew ...

  6. Xcode7中创建静态库

    一.静态库和动态库的区别: 静态库和动态库是相对编译期和运行期的,静态库以 .a 和 .framework 形式存在,链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝:动态库以 ...

  7. 演练:创建和使用静态库 (C++)

    我们将创建的下一个库类型是静态库 (LIB). 使用静态库是重用代码的一种绝佳方式. 您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可. ...

  8. 【Visual Studio】创建并使用静态库(.lib)

    创建并使用静态库[.lib] 参考文档 先决条件 创建静态库项目 向静态库添加类 向静态库添加类 备注 创建引用静态库的 C++ 控制台应用 在 Visual Studio 2019 中创建引用静态库 ...

  9. GCC : 什么是编译?什么是静态库?什么是动态库?怎么生成?优先级?

    本文旨在让大家真正明白C程序如何运行.库文件的种类区别.如何生成.如何使用等! 一.简介: gcc 最初是 "GNU C Compiler" 的简称,只是当作一个 C 语言的编译器 ...

最新文章

  1. 皮一皮:前女友竟然说这种话...
  2. EMNLP 2021 | PairSupCon:基于实例对比学习的句子表示方法
  3. python飞机大战资料-Python之游戏开发-飞机大战
  4. ssl1072-砝码称重【dp练习】
  5. LeetCode 515. 在每个树行中找最大值(层序遍历)
  6. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下跌2.98%
  7. matlab2c使用c++实现matlab函数系列教程-circshift函数
  8. python 文件名以数字开头_python-如何使XML标记以数字开头?
  9. newifi mini锐捷校园网路由器配置教程
  10. wince怎么刷carplay_carplay wince安装版
  11. 寻找 Symbian 编码(三)
  12. 克鲁伊夫:巴萨孤独求败 无巨星照样演完美风暴(2009-11-26)
  13. 灰灰考研c语言讲义,【灰灰考研】操作系统复习全书.pdf
  14. 百度地图api的实现
  15. 年收入30万的家庭如何买保险最划算?
  16. beanstalkd队列简述
  17. WOL 实现命令。(Wake On LAN - 局域网唤醒)
  18. IP定位的具体网络应用
  19. CET-4、CET-6复习
  20. python下载文件保存_Python根据URL地址下载文件并保存至对应目录的实现

热门文章

  1. MeEdu - 开源在线教育点播系统。
  2. 千博企业网站管理系统源码 支持电脑和手机版
  3. 随行笔记小程序个人信息页源码
  4. IDEA配置Docker一键部署SpringBoot项目(企业级做法)
  5. MSN、QQ的网页链接代码
  6. jQuery插件实现网页底部自动加载-类似新浪微博
  7. Drupal 7 主题模板概述
  8. 挖掘建模-分类与预测-回归分析-逻辑回归
  9. 【三维深度学习】Sparse Convolutional Network 基于稀疏采样不变性的深度稠密重建
  10. 【今日CV 计算机视觉论文速览】Fri, 22 Feb 2019