注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

水木的博客

唱好人生中的每一场戏

 
 
 

日志

 
 

iOS开发之---静态库的编译以及相关问题的处理  

2012-07-18 00:01:15|  分类: Iphone&Ipad开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近在做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文件。命令如下:

合并的时侯应该是 lipo -creat 静态库的路径 静态库的路径 -output 输出的路径+输出的名字 


14.打包以后的库文件,我们查看信息,可以看到如下信息:


现在我们这个静态库,支持的构架已经是armv6 armv7 i386了。

15.ok,这个通用库生成后,我们将原来,调用这个库进行替换一下,在进行编译,成功编译,并且可以看到在命令行里面显示的我们helloworld这个函数打印出来的东西。


OK,成功。接触这个也就1个月不到的时间,还不是很深刻的理解,如果有问题,请大家指出,谢谢。

BTW,看过基本IOS开发的书籍,基本中文的,都是从英文翻译过来的,不是很给力啊,中文翻译的质量也伤不起。建议大家还是看些英文资料和developer.apple。。当然多写,多实验才是王道。后续在下载里面,我会分享一些stanford的ios开发课程的课件,Stanford的老师讲解的还是比较清楚的。网易的公开课程也有相关的视频。





转自:http://blog.csdn.net/steve1018/article/details/6902973

  评论这张
 
阅读(1048)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017