- 浏览: 663125 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lizaochengwen:
网络请求碰到的中文乱码使用encodeURL吧- (NSStr ...
iPhone开发/iPad开发 中文乱码问题 -
hhb19900618:
还是没弄懂怎么解决了中文乱码? 正确代码能重写贴出吗
iPhone开发/iPad开发 中文乱码问题 -
zhengjj_2009:
我的理解是讲ipa文件解压缩之后再重新打包,已经破坏了签名,所 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
zhengjj_2009:
我参考你的“ 从ipa格式的母包生成其它渠道包的shell脚本 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
同一片天空:
问题果然解决了
iOS 搭建 XMPP实现环境
最近在做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,经过上述步骤后
这个通用库生成后,我们将原来,调用这个库进行替换一下,在进行编译,成功编译,运行结果如下所示:
原文:http://blog.csdn.net/pjk1129/article/details/7255163
我这个文档的静态库的开发是基于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,经过上述步骤后
这个通用库生成后,我们将原来,调用这个库进行替换一下,在进行编译,成功编译,运行结果如下所示:
原文:http://blog.csdn.net/pjk1129/article/details/7255163
发表评论
-
SOCK_STREAM和SOCK_DGRAM
2015-07-23 20:08 1658sock_stream 是有保障的(即能保证数据正确传送到 ... -
SOCKET bind INADDR_LOOPBACK和INADDR_ANY的区别
2015-07-23 19:49 2062今天写程序时候,服务器端启动了,然后客户端总是连接不上,con ... -
htons()
2015-07-23 19:26 589在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺 ... -
使用symbolicatecrash分析crash文件
2015-03-10 11:32 1189原文 http://www.cnblogs.com/ning ... -
程序设计中的计算复用(Computational Reuse)
2015-02-10 10:18 673从斐波那契数列说起 ... -
didReceiveMemoryWarning
2015-02-09 16:11 548IPhone下每个app可用的内存是被限制的,如果一个app使 ... -
iOS开发中怎么响应内存警告
2015-02-09 16:08 659好的应用应该在系统内存警告情况下释放一些可以重新创建的资源。在 ... -
ASIHTTPRequest多次重复请求的问题
2014-12-17 14:34 648在一个车票订购的项目中,点击一次订购,却生成了2次订单,通过抓 ... -
从 CloudKit 看 BaaS 服务的趋势
2014-09-26 11:51 731从 6 月份 WWDC 苹果发布 ... -
ios编程--AVCapture编程理解
2014-09-26 11:03 9480、媒体采集的几个东西。这里所需要明白的是,在这个流程中,这里 ... -
NSURLProtocol
2014-09-25 10:42 8281、http://nshipster.com/nsurlpro ... -
关于iOS8的extension插件
2014-09-25 10:41 1303关于iOS8的extension插件,有兴趣的同学可以参考一下 ... -
【转】ios app在itunesConnect里面的几种状态
2014-08-05 10:34 1155Waiting for Upload (Yellow) Ap ... -
[转]iOS Dev (45) iOS图标与切片处理工具Prepo
2014-02-07 17:02 1037iOS Dev (45) iOS图标与切片处理工具Prepo ... -
phoneGap开发IOS,JS调用IOS方法/phoneGap插件开发
2014-01-13 17:49 1250前沿 废话不说phoneGap是什么不多介绍,官方网站: h ... -
如何在IOS平台下搭建PhoneGap开发环境(PhoneGap2.5)
2014-01-13 15:23 755由于在下最近在做基于HTML5的跨平台移植,搭建环境的时候着实 ... -
【翻译】ios教程-创建静态库
2013-12-20 18:19 3126作者:shede333 主页:htt ... -
封装自己的控件库:iPhone静态库的应用
2013-12-20 17:03 597由于iPhone 控件的极度匮乏和自定义组件在重用上的限制,在 ... -
iphone:使用NSFileManager取得目录下所有文件(遍历所有文件)
2013-11-18 17:56 878From:http://note.sdo.com/u/xiao ... -
ios7-录音权限访问-AVAudioSession
2013-11-15 19:39 11810///新增api,获取录音权限. 返回值,YES为无拒绝,NO ...
相关推荐
本篇将深入讲解如何使用Xcode4来创建静态库,这尤其适用于开发者希望共享代码或者创建可重用的模块。 首先,我们需要了解什么是静态库。静态库在编译时会被完整地链接到目标应用中,成为应用程序的一部分。这意味着...
总结来说,Xcode 4中创建静态库的过程主要包括:新建静态库项目、编写库代码、配置编译设置、编译生成静态库、检查和合并架构、以及在新项目中引入和使用静态库。了解这一过程对iOS开发者来说至关重要,因为它有助于...
### Xcode 制作静态库详解 #### 引言 在iOS开发中,静态库的创建与使用是一项基本但至关重要的技能。静态库允许开发者将常用功能或代码片段封装起来,便于在多个项目中重复利用,同时也有助于保护源代码不被他人...
在iOS开发中,静态库是一种常见的组件化方式,它允许开发者将特定的功能模块打包成一个独立的库,供其他应用或SDK使用。然而,传统的静态库打包过程繁琐,需要手动合并.a文件、拷贝头文件并打包。本文将详细介绍如何...
### iOS静态库问题详解 #### 一、概述 在iOS开发过程中,静态库的应用非常广泛。它可以有效地将一些通用的功能封装起来,便于多个项目共享,同时也能够保护代码不被轻易查看。本文旨在分享在制作iOS静态类库的过程...
如果需要在应用中加入静态库,可以通过“Project > New Target”菜单选择“Static Library”添加至iPhoneOS/Cocoa Touch列表中,并确保移除了Code Signing Identity设置。 ##### 2. 设计用户界面 用户界面的设计是...
《iOS平台上Gif制作工具开发详解——以GifMaker为例》 在当今移动互联网时代,动态图像是传达信息、表达情感的重要方式之一,GIF(Graphics Interchange Format)格式因其小巧且支持循环播放的特点,成为了网络上...
- **许可证类型**: Cocos2D-iPhone采用GNU LGPLv3许可证,但鉴于iOS平台特性,扩展了该协议以允许通过静态链接库或直接使用源代码的方式集成而不必公开自己的源代码。 - **版权要求**: - 开发者可以免费使用Cocos2D...
《跑男:基于Cocos2D的iOS游戏开发详解》 在移动游戏开发领域,Cocos2D是一款广泛使用的开源框架,尤其在iOS平台上,它为开发者提供了强大的2D游戏开发工具。本篇文章将深入探讨如何利用Objective-C编程语言与Cocos...