当前位置: 移动技术网 > IT编程>移动开发>IOS > xcode 4 制作静态库图文详解

xcode 4 制作静态库图文详解

2019年07月24日  | 移动技术网IT编程  | 我要评论

忽而今夏19楼,沙龙国际娱乐城,政府无能

最近在做apple的ios开发,有开发静态库的需求,本身ios的开发,只允许静态库或者framework。在xcode上没有找到允许编译,如同android上的*.so和win32上的dll这样的说法。不过framework这样的框架,估计也是类似动态库的实现,不过没有具体研究过,后续继续深入研究。

我这个文档的静态库的开发是基于xcode4.2和ios sdk5.0编写的。xcode4跟之前的xcode3还是有不少的差别的。

下面就简单写一个静态库和一个调用静态库的例子。

静态库的编写:

1.静态库工程的建立:

xcode new一个新的project,选择ios下面的framework&library,下面有一个cocoa touch static library。直接next去建立一个print这样的工程。


2.工程建立

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



3.编译前准备

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


4.ok,编译

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

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

       

5.ok

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

打开终端写入如下命令:这是什么?这就是所在的路径 

以下均是在自己的mac上的路径。你需要将/users/pjk1129/library/developer/xcode/deriveddata/print-dgfkluumuexoxhcapzidtsmdgqcj/build/products/ 替换成你的路径。

cd /users/pjk1129/library/developer/xcode/deriveddata/print-dgfkluumuexoxhcapzidtsmdgqcj/build/products/  

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


这个是给真机用的,那我们要给模拟器和真机封装的静态库应该都能用才好。这个下面介绍!!!!!  


然后再在终端 打开这个文件:cd /users/user/library/developer/xcode/deriveddata/uitab-dbvoszbzpavyglaboxgflvrnzfce/build/products/debug-iphoneos

命令是:lipo -info libprint.a,可以看到显示的结果是:arch是  arm7。下面我会具体介绍一下。


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

应用就很简单了,我们添加刚才libprint.a的*.h文件。 然后在这个工程的build phases的link binary with library里面添加我们刚才拷贝出来的那个libprint.a。



7.插入了h和a文件后

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

#import "astrodiskappdelegate.h"

#import "print.h"


@implementation astrodiskappdelegate


@synthesize window = _window;


- (void)dealloc

{

    [_window release];

    [_viewcontroller release];

    [super dealloc];

}


- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions

{

    

    //调用libprint.a

    [print printb];

    print  *print = [[[print alloc] init] autorelease];

    [print printa];


    self.window = [[[uiwindow alloc] initwithframe:[[uiscreen mainscreen] bounds]] autorelease];

    [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的库呢?看见第二张图片的print>ios device了么?我们将这个ios device修改成iphone5.0 simulator。在进行编译,这样就可以编译出i386下面的库。这个时候我们show in finder打开的文件夹还是ios device下的库。我们最好自己去那个目录下看一下。这里我们用command去查看了一下目录情况,如下:可以看到一个iphoneos的目录和一个simulator的目录。


然后我们再看看这个目录与第4条所示的目录有什么不同! 同样也有一个libprint.a文件。



10.错误原因分析

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

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

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

将/users/user/library/developer/xcode/deriveddata/uitab-dgfkluumuexoxhcapzidtsmdgqcj/build/products替换成你的路径。 

将/users/user/desktop/libprint.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


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

然后打入如下命令:lipo -info /users/pjk1129/desktop/libprint.a 

可以看到如下信息:


如上,你已经看到了,它具备了i386和arm7的条件。 现在我们这个静态库,支持的构架已经是armv7 i386了。


13.ok,经过上述步骤后

这个通用库生成后,我们将原来,调用这个库进行替换一下,在进行编译,成功编译,运行结果如下所示:

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网