转自:http://blog.csdn.net/steve1018/article/details/6902973
最近在做Apple的IOS开发,有开发静态库的需求,本身IOS的开发,只允许静态库或者Framework。在Xcode上没有找到允许编译,如同Android上的*.so和Win32上的dll这样的说法。不过Framework这样的框架,估计也是类似动态库的实现,不过没有具体研究过,后续继续深入研究。BTW,我这个文档的静态库的开发是基于Xcode4.1和iOS SDK4.3编写的。Xcode4跟之前的Xcode还是有不少的差别的。
下面就简单写一个静态库和一个调用静态库的例子。
静态库的编写:
1.静态库工程的建立:Xcode New一个新的project,选择IOS下面的Framework&Library,下面有一个Cocoa Touch Static Library。直接next去建立一个staticlib这样的工程。
2.工程建立了,我们添加一个很简单的"- (void)helloworld;"的方法,这个方法的实现也是很简单的,在*.m文件中的实现就是一个"NSLog(@“helloworld”);"这样我们编译出来的libstaticlib就可以被其他的IOS工程进行调用了。这块注意一下,目前我们的staticlib->iOS Device
3.OK,编译,我们可以在Products下面找到我们编译生成的libstaticlib.a这个文件。
4.ok,在这个文件上Open In Finder。这时候我们打开了一个文件夹,里面有一个libstaticlib.a。后面我们继续编写一个调用这个libstaticlib.a的Base UI App。但是这个App在编译时候会出错,通过这个错误的解决,说明Xcode的一些编译相关的东西。这里,我们在command下面根据路径找到这个文件,用这个非常重要的命令查看一下这个lib的信息!命令是:lipo -info libstaticlib.a,可以看到显示的结果是:Arch是Arm6 Arm7。如果只是做应用的朋友可能不是很了解这个东西,后面我会具体介绍一下。
5.将这个libstaticlib.a拷贝出来,用于后面应用的调用。
6.建立一个调用这个staticilib的应用。应用就很简单了,就是一个很简单的base UI的app就可以。OK,我们添加刚才static lib的*.h文件。
然后在这个工程的Build Phases的Link Binary With Library里面添加我们刚才拷贝出来的那个libstaticlib.a。
7.插入了h和a文件后,我们就可以在control里面调用这个staticlib里面的函数了。
8.函数的调用就比较简单了。
在statictestViewController.m这个文件中,#import "staticlib.h"这个头文件。
然后在
- (void)viewDidLoad
{
staticlib *a = [[staticlib alloc]init];
[a helloworld];
[super viewDidLoad];
}
9.OK,编译运行这个应用程序。额。。。错误了。。这个就是这篇文档的关键了。主要就是为了介绍编译静态库相关的东西。
10.可以看到undefine symbols for architecture i386这样的错误。其实这个错误原因很简单,就是因为,我们用错了编译出来的static lib,在模拟器里面,我们需要的是基于i386构架编译的static lib,但是这个a文件,大家还记得前面说的arm6 arm7构架的么。这个a其实是在iphone这个arm构架上运行的代码。其实show in finder指向的是一个ios device的库,并不是i386模拟器下的库。那如何编译i386的库呢?还记得上面说的staticlib->iOS Device么?我们将这个iOS Device修改成iPhone4.3 Simulator。在进行编译,这样就可以编译出i386下面的库。这个时候我们show in finder打开的文件夹还是ios device下的库。我们最好自己去那个目录下看一下。这里我们用command去查看了一下目录情况,如下:可以看到一个iphoneos的目录和一个simulator的目录。
11.这二个文件夹下的,debug-iphoneos里面的是基于arm6 arm7编译出来的库文件。debug-iphonesimulator文件夹下面的是基于i386编译出来的文件。如图,可以注意command里面显示的信息。
12.这个可以看到我们一个构架是armv6 armv7和i386的。有二个库,这二个库一个是用于真机运行的一个是用于模拟器运行的。
13.其实我们可以利用lipo将这二个文件打包成一个通用的a文件。命令如下:
14.打包以后的库文件,我们查看信息,可以看到如下信息:
现在我们这个静态库,支持的构架已经是armv6 armv7 i386了。
15.ok,这个通用库生成后,我们将原来,调用这个库进行替换一下,在进行编译,成功编译,并且可以看到在命令行里面显示的我们helloworld这个函数打印出来的东西。
OK,成功。接触这个也就1个月不到的时间,还不是很深刻的理解,如果有问题,请大家指出,谢谢。
BTW,看过基本IOS开发的书籍,基本中文的,都是从英文翻译过来的,不是很给力啊,中文翻译的质量也伤不起。建议大家还是看些英文资料和developer.apple。。当然多写,多实验才是王道。后续在下载里面,我会分享一些stanford的ios开发课程的课件,Stanford的老师讲解的还是比较清楚的。网易的公开课程也有相关的视频。