iOS杂谈17—静态库制作


        

一直想制作一静态库,由于本人比较扯皮,导致一直未制作,今天周末,特意翻翻资料,将整个制作静态库过程贴如下,以方便自己,也方便广大同行。

        我这个文档的静态库的开发是基于Xcode4.6和iOS SDK5.1编写的。Xcode4跟之前的Xcode3还是有不少的差别的。


        1.静态库工程的建立:

Xcode New一个新的project,选择IOS下面的Framework&Library,下面有一个Cocoa Touch Static Library。直接next去建立一个【StaticLibrary】这样的工程。


2.工程建立

我们添加很简单的"- (void)printA;"和"+ (void)printB;"的方法,这个方法的实现也是很简单的,在*.m文件中的实现就是一个"NSLog(@“”);"这样我们编译出来的libstaticlib就可以被其他的IOS工程进行调用了。这块注意一下,目前我们的 StaticLibrary---->IOS Device


3.编译前准备

这里分release与debug版本,需要设置一下




4.OK,编译

我们可以在Products下面找到我们编译生成的libStaticLibrary.a这个文件。

注意未编译前为红色:左                             编译后为黑色: 右


5.ok

在右边 这个文件上右键Show In Finder。这时候我们打开了一个文件夹,里面有一个libStaticLibrary.a。后我们继续编写一个调用这个libStaticLibrary.a的App。但是这个App在编译时候会出错,通过这个错误的解决,说明Xcode的一些编译相关的东西。这里,我们在command下面根据路径找到这个文件,用这个非常重要的命令查看一下这个libStaticLibrary.a的信息!

打开终端写入如下命令:

你需要将 /Users/chengwuli125/Library/Developer/Xcode/DerivedData/StaticLibrary-dzwqkwpvjxdirsgfkagrlyeuzvst/Build/Products/Release-iphoneos(这是我自己mac上 .a文件的路径)   替换成你的路径。

cd /Users/chengwuli125/Library/Developer/Xcode/DerivedData/StaticLibrary-dzwqkwpvjxdirsgfkagrlyeuzvst/Build/Products/Release-iphoneos  

我们手动打开这个路径:可以看到如下信息:Release-iphoneos



然后再在终端 打开这个文件:/Users/chengwuli125/Library/Developer/Xcode/DerivedData/StaticLibrary-dzwqkwpvjxdirsgfkagrlyeuzvst/Build/Products/Release-iphoneos 
命令是:lipo -info libStaticLibrary.a,可以看到显示的结果是:Arch是  Arm7。


6.建立一个调用这个libPrint.a的应用

应用就很简单了,我们添加刚才StaticLibrary的*.h文件。 然后在这个工程的Build Phases的Link Binary With Library里面添加我们刚才拷贝出来的那个libStaticLibrary.a


7.插入了h和a文件后

我们就可以在control里面调用这个libStaticLibrary.a 函数了。

#import "StaticLibrary.h"

@implementation AppDelegate

- (void)dealloc
{
    [_window release];
    [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    
    [StaticLibrary printB];
    StaticLibrary *staic = [[[StaticLibrary alloc] init] autorelease];
    [staic printA];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

8.OK,编译运行这个应用程序。

编译出现错误了。这个就是这篇文档的关键了。



9.可以看到undefine symbols for architecture i386这样的错误。

其实这个错误原因很简单,就是因为,我们用错了编译出来的libUITab.a lib,在模拟器里面,我们需要的是基于i386构架编译的static lib,但是这个a文件,大家还记得前面说的arm6 arm7构架的么。这个a其实是在iphone这个arm构架上运行的代码。其实show in finder指向的是一个ios device的库,并不是i386模拟器下的库。那如何编译i386的库呢?看见第二张图片的StaticLibrary>IOS Device了么?我们将这个iOS Device修改成iPhone5.1 Simulator。在进行编译,这样就可以编译出i386下面的库。这个时候我们show in finder打开的文件夹还是ios device下的库。我们最好自己去那个目录下看一下。这里我们用command去查看了一下目录情况,如下:可以看到一个iphoneos的目录和一个simulator的目录。


10.错误原因分析

Release-iphoneos里面的是基于arm6 arm7编译出来的库文件。Release-iphonesimulator文件夹下面的是基于i386编译出来的文件。


11.合并.a文件,制作通用静态库

这二个库一个是用于真机运行的一个是用于模拟器运行的.其实我们可以利用lipo将这二个文件打包成一个通用的a文件。命令如下:

/Users/chengwuli125/Library/Developer/Xcode/DerivedData/StaticLibrary-dzwqkwpvjxdirsgfkagrlyeuzvst/Build/Products/Release-iphoneos替换成你的路径。 

将/Users/chengwuli125/Desktop/libStaticLibrary.a替换成合并后的路径。 

lipo -create /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphonesimulator/libPrint.a  /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphoneos/libPrint.a  -output /Users/pjk1129/Desktop/libPrint.a


lipo -create /Users/chengwuli125/Library/Developer/Xcode/DerivedData/StaticLibrary-dzwqkwpvjxdirsgfkagrlyeuzvst/Build/Products/Release-iphonesimulator/libStaticLibrary.a /Users/chengwuli125/Library/Developer/Xcode/DerivedData/StaticLibrary-dzwqkwpvjxdirsgfkagrlyeuzvst/Build/Products/Release-iphoneos/libStaticLibrary.a-output /Users/chengwuli125/Desktop/libStaticLibrary.a



12.打包以后的库文件,我们查看信息

然后打入如下命令:lipo -info /Users/chengwuli125/Desktop/libStaticLibrary.a

可以看到如下信息:




13.ok 看运行成果




14 大功告成 歇菜了 哈哈 从此你就正式可以进行对自己需要的库就行打包啦,高兴了大笑三声吧 哈哈哈



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值