xcode4制作静态库图文详解
最近在做Apple的IOS开发,有开发静态库的需求,本身IOS的开发,只允许静态库或者Framework。在Xcode上没有找到允许编译,如同Android上的*.so和Win32上的dll这样的说法。不过Framework这样的框架,估计也是类似动态库的实现,不过没有具体研究过,后续继续深入研究。
我这个文档的静态库的开发是基于Xcode4.2和iOSSDK5.0编写的。Xcode4跟之前的Xcode3还是有不少的差别的。
XcodeNew一个新的project,选择IOS下面的Framework&Library,下面有一个CocoaTouchStaticLibrary。直接next去建立一个Print这样的工程。
2.工程建立
我们添加很简单的"-(void)printA;"和"+ (void)printB;"的方法,这个方法的实现也是很简单的,在*.m文件中的实现就是一个"NSLog(@“”);"这样我们编译出来的libstaticlib就可以被其他的IOS工程进行调用了。这块注意一下,目前我们的Print->iOSDevice
3.编译前准备
这里分release与debug版本,需要设置一下
4.OK,编译
我们可以在Products下面找到我们编译生成的libstaticlib.a这个文件。
注意未编译前为红色:左 编译后为黑色: 右
5.ok
在右边 这个文件上右键OpenInFinder。这时候我们打开了一个文件夹,里面有一个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-infolibPrint.a,可以看到显示的结果是:Arch是 Arm7。下面我会具体介绍一下。
6.建立一个调用这个libPrint.a的应用
应用就很简单了,我们添加刚才libPrint.a的*.h文件。 然后在这个工程的BuildPhases的LinkBinaryWithLibrary里面添加我们刚才拷贝出来的那个libPrint.a。
7.插入了h和a文件后
我们就可以在control里面调用这个libPrint.a 函数了。
#import"AstroDiskAppDelegate.h"
#import"Print.h"
@implementationAstroDiskAppDelegate
@synthesizewindow=_window;
-(void)dealloc
{
[_windowrelease];
[_viewControllerrelease];
[superdealloc];
}
-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
//调用libPrint.a
[PrintprintB];
Print *print=[[[Printalloc]init]autorelease];
[printprintA];
self.window=[[[UIWindowalloc]initWithFrame:[[UIScreenmainScreen]bounds]]autorelease];
[self.windowmakeKeyAndVisible];
returnYES;
}
8.OK,编译运行这个应用程序。
编译出现错误了。这个就是这篇文档的关键了。主要就是为了介绍编译静态库相关的东西。
9.可以看到undefinesymbolsforarchitecturei386这样的错误。
其实这个错误原因很简单,就是因为,我们用错了编译出来的libUITab.a lib,在模拟器里面,我们需要的是基于i386构架编译的staticlib,但是这个a文件,大家还记得前面说的arm6arm7构架的么。这个a其实是在iphone这个arm构架上运行的代码。其实showinfinder指向的是一个iosdevice的库,并不是i386模拟器下的库。那如何编译i386的库呢?看见第二张图片的Print>IOSDevice了么?我们将这个iOSDevice修改成iPhone5.0 Simulator。在进行编译,这样就可以编译出i386下面的库。这个时候我们showinfinder打开的文件夹还是iosdevice下的库。我们最好自己去那个目录下看一下。这里我们用command去查看了一下目录情况,如下:可以看到一个iphoneos的目录和一个simulator的目录。
然后我们再看看这个目录与第4条所示的目录有什么不同!同样也有一个libPrint.a文件。
10.错误原因分析
Release-iphoneos里面的是基于arm6arm7编译出来的库文件。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的条件。 现在我们这个静态库,支持的构架已经是armv7i386了。
这个通用库生成后,我们将原来,调用这个库进行替换一下,在进行编译,成功编译,运行结果如下所示:
相关文章
- Python 进阶 — Flake8 静态代码检查工具
- Java静态内部类(static class)[通俗易懂]
- 静态代理和动态代理详解[通俗易懂]
- Nginx Rewrite 伪静态配置参数详解
- C/C++ 静态编译SQLITE数据库API
- 【Linux 内核】进程管理 - 进程优先级 ② ( prio 调度优先级 | static_prio 静态优先级 | normal_prio 正常优先级 | rt_priority 实时优先级 )
- POST方式请求静态资源时nginx提示405 NotAllow错误解决方法详解程序员
- Nginx/Apache之伪静态设置 – 运维小结详解程序员
- iOS项目生成静态库文件(.a)详解手机开发
- SpringMVC中避免拦截css,js,html图片等静态文件详解编程语言
- Java 静态导入详解编程语言
- 使用静态内部类实现单例设计模式详解编程语言
- C++静态成员变量和静态成员函数详解
- Java static静态修饰符详解:静态变量、静态方法及静态代码块
- Linux 伪静态设置简要指南(linux伪静态)
- 静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
- Tomcat无法加载css和js等静态资源文件的解决思路
- thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
- PHP中使用smarty生成静态文件的例子
- PHP合并静态文件详解
- Oracle静态注册与动态注册详解