`

ios 静态库

    博客分类:
  • ios
阅读更多

ios 静态库制作过程

 

最 近在做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静态库制作实例

    本实例主要探讨如何制作包含Category的iOS静态库,解决静态库中对Category的使用问题。 首先,让我们了解Category在Objective-C中的作用。Category是Objective-C的一个强大特性,允许我们扩展已有类的功能,而无需...

    gmssl iOS静态库,支持arm64,支持bitcode

    GMSSL iOS静态库是专为苹果移动平台设计的加密库,尤其针对iOS设备的arm64架构进行了优化,同时支持Bitcode技术。这个库的主要功能是实现国密(国家密码算法)加密、解密以及SSL通信,使得在iOS应用开发中能够安全地...

    IOS 静态库打包流程简化详细介绍

    总之,iOS静态库打包流程的简化不仅能够节省开发者的时间,还能降低出错概率,提高软件发布的质量。对于大型项目和SDK开发,这种自动化流程是不可或缺的。通过学习和理解这一过程,开发者可以更好地管理和维护自己的...

    iOS静态库项目的创建和使用源码

    本文将详细介绍如何创建和使用iOS静态库,并提供源码示例。 一、静态库的创建 1. 创建Xcode工程:首先,我们需要在Xcode中创建一个新的项目,选择"File" -> "New" -> "Project",然后在模板选择器中选择"Cocoa ...

    IOS静态库MyStaticLib

    本篇将详细介绍如何创建并使用iOS静态库,以及`MyStaticLib`和`MyStaticLibUse`这两个项目在其中的作用。 一、iOS静态库的创建 1. **创建静态库工程** - 打开Xcode,选择"File" -> "New" -> "Project",在模板...

    protobuf iOS静态库

    本教程将详细介绍如何在iOS平台上编译protobuf 2.6.1版本为静态库。 首先,我们需要从官方仓库下载protobuf的源代码。可以访问protobuf的GitHub页面(https://github.com/protocolbuffers/protobuf/releases)找到...

    iOS 测试静态库

    本篇将深入探讨如何创建并测试iOS静态库。 首先,我们来理解静态库的基本概念。静态库在编译时会被直接链接到目标应用中,成为应用的一部分。这意味着应用的体积可能会增加,因为它包含了库的所有代码,但同时也...

    iOS静态库生成方法

    本篇文章将详细介绍如何在Xcode中生成iOS静态库,以及如何处理不同设备(模拟器与真机)的兼容问题。 1. **创建静态库项目** 首先,你需要在Xcode中创建一个新的项目,选择"File" -> "New" -> "Project",然后在...

    ffmepg 2 5 3 for iOS静态库 armv7 armv7s i386 x86 64 arm64

    标题提到的是FFmpeg 2.5.3 版本的iOS静态库,这个版本适用于多个iOS设备架构,包括armv7、armv7s、i386、x86_64以及arm64。静态库的好处是将所有依赖项都包含在内,使得在不同设备上运行时无需担心依赖问题。 1. **...

    ios静态库问题

    ### iOS静态库问题详解 #### 一、概述 在iOS开发过程中,静态库的应用非常广泛。它可以有效地将一些通用的功能封装起来,便于多个项目共享,同时也能够保护代码不被轻易查看。本文旨在分享在制作iOS静态类库的过程...

    libevent_iOS 静态库文件

    在这个“libevent_iOS 静态库文件”中,我们聚焦于如何在iOS应用中集成并利用这个库,特别是与OpenSSL的兼容性,以及在SDK6.0及更高版本中的应用。 首先,Libevent的核心功能是其事件基础架构。它通过提供一种机制...

    ios静态库.zip

    .a 文件:纯二进制文件,需要配合 .h 文件一起使用,通过 .h 文件引用库里面的内容

    protobuf ios静态库打包教程使用 xocde6包含 arm64 支持

    标题中的知识点包括:protobuf,iOS静态库,打包教程,使用xcode6,包含arm64支持。描述中的知识点包括:iOS静态库,protobuf,arm64,armv7,armv7s,添加了arm64支持,解决了由于APPLE在官方库中引用protobuf导致...

    ios-静态库实现版本对比.zip

    总之,"ios-静态库实现版本对比.zip"是一个关于iOS静态库版本管理的资源,它可以帮助开发者更好地管理和对比不同版本的静态库,优化项目结构,提高开发效率。通过深入理解静态库的工作原理,结合"VersionTool"的使用...

    libevent-2.1.8-stable for iOS 包含静态库与编译脚本,支持OpenSSL,包含openssl-1.1.1 for ios静态库

    源码编译,包含libevent-2.1.8-stable for iOS 静态库与编译脚本,支持OpenSSL,包含openssl-1.1.1 for ios静态库与编译脚本,支持平台:arm64\armv7\armv7s\i386

    gmssl iOS 静态库,包含了模拟器和真机架构

    gmssl iOS静态库,包含了 arm64,armv7,armv7s,i386,x86_64架构。

    ffmepg 2.4.2 for iOS静态库 (armv7 armv7s i386 x86_64 arm64)

    总之,FFmpeg 2.4.2 for iOS 静态库提供了一个全面的多媒体处理解决方案,覆盖了多种 iOS 设备的架构,使开发者能够轻松地在 iOS 应用中实现音视频的编码、解码、转换和播放功能。然而,为了遵循苹果的政策并获得...

    ffmepg 2.8 for iOS静态库 (armv7 armv7s i386 x86_64 arm64)

    总的来说,FFmpeg 2.8 for iOS静态库是开发者实现多媒体处理功能的重要工具。尽管随着版本更新,FFmpeg的功能和性能都在不断提升,但2.8版本仍因其稳定性和广泛的设备支持而被广泛使用。正确集成并充分利用这个库,...

    libmp3lame(3.100)_iOS静态库支持arm64,v7,v7s,x86_64以及bitcode

    "libmp3lame(3.100)_iOS静态库支持arm64,v7,v7s,x86_64以及bitcode" 这个标题揭示了几个关键信息。首先,libmp3lame是用于编码MP3音频的开源库,版本为3.100。它是针对iOS平台设计的,这意味着它符合Apple的iOS操作...

Global site tag (gtag.js) - Google Analytics