iOS中.a和.framework静态库的创建与.bundle资源包的使用详解

前言

开发中经常使用三方库去实现某特定功能,而这些三方库通常又分为开源库和闭源库。开源库可以直接拿到源码,和自己写的没有什么区别,我们可以最大程度的修改源码来适应自己功能。闭源库就是被发布者提前打包好的静态库或 Bundle 包,对此我们无法看到内部实现,对于其封装好的特定功能,我们也只需要调用其开放的API即可。

在正式的上代码之前,先介绍一些从网上搜集的静态库相关的基本概念,以加深对后面知识的理解

1. 库

库实际上是一种代码共享的方式,主要用于代码重用和源码隐藏,通常分为动态库和静态库。

2. 区别

静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存空间。

3. iOS中静态库的形式

在iOS中静态库以.a和.framework的形式存在,动态库以.dylib和.framework的形式存在。

之所以.framework既可能是动态库又可能是静态库,是因为苹果公司禁止用户级App使用动态库,而自己却又堂而皇之的使用动态库,这就造成了iOS中系统级的.framework是动态库,用户级的.framework是静态库(无可奈何啊)。

本文就来讲解一下 .a 和 .framework 静态库的创建与 .bundle 资源包的使用。

库分静态库和动态库两种。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。

静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

静态库的形式

形式为 :.a 和 .framework 两种

其中 .framework 类型的库如果是系统内部的是动态库,我们自己创建的是静态库

.a 和 .framework 的区别

.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。

.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。

.a + .h + sourceFile = .framework。

建议用.framework。

静态库的优势

  • 方便共享代码,便于合理使用。
  • 实现iOS程序的模块化。可以把固定的业务模块化成静态库。
  • 和别人分享你的代码库,但不想让别人看到你代码的实现。
  • 开发第三方sdk的需要。

创建和打包 .a 静态库

  • 创建静态库项目
    iOS --> Framework & Library --> Cocoa Touch Static Library
  • 把需要编译成静态库的代码拖进项目
  • 设置可见的.h文件。
    Build Phases --> Copy Files 添加.h文件即可。

1.修改支持的架构

4.1 设置支持所有模拟器架构 Build Settings --> Build Active Architecture Only --> Debug 改为 NO

4.2设置支持所有手机架构

2.编译

编译一次模拟器,编译一次手机。

会生成.a文件 和 可见的头文件。

使用命令行,合并刚刚生成的的两个路径,到另一个路径,例如:

lipo -create 模拟器lib路径 真机lib路径 -output /Users/username/Desktop/libPSSTest.a

3.使用静态库

注意:如果这个静态库需要依赖库,也是需要引入依赖库。

创建和打包 .framework 静态库

1.创建Framework项目

iOS --> Framework & Library --> Cocoa Touch Framework

2.修改打包的framework是动态库还是静态库

framework项目默认是动态库。

静态库配置:Build Settings --> Mach-O Type --> 改为 Static Library

3.把需要编译成静态库的代码拖进项目

设置可见头文件

项目创建后,项目中只有一个主头文件。

Build Phases --> Headers --> public 添加头文件

4.编译

编译一次模拟器,编译一次手机

5.使用

把framework引入项目。

如果是动态库需要在 General --> Embedded Binaries 中引入配置。

如果是静态库就不需要配置了。

静态库问题

1.静态库位置 Debug运行真机编译会把静态库生成到 Debug-iphoneos目录下

Debug运行模拟器编译会把静态库生成到 Debug-iphonesimulator目录下

Release运行真机编译会把静态库生成到 Release-iphoneos目录下

Release运行模拟器编译会把静态库生成到 Release-iphonesimulator目录下

2.Debug版本 VS Release版本

调试版

调试版本会包含完整的符号信息,以方便调试

调试版本不会对代码进行优化

发布版

发布版本不会包含完整的符号信息 发布版本的执行代码是进行过优化的

发布版本的大小会比调试版本的略小

在执行速度方面,调试版本会更快些,但不意味着会有显著的提升

3.Undefind symbols for architecture arm64(i386)

原因:是静态库不支持cpu arm64(i386)架构

4.iPhone手机的cpu架构

模拟器

iPhone4s,5 是 i386架构

iPhone5s以后 是x86_64架构

发布版

iphone1代,3G,3GS 是 armv6架构

iPhone4,4s 是 armv7架构

iphone5,5s,5c 是 armv7s架构

iPhone6,6s,6plus,6splus 是 arm64架构

5.查看.a库所支持的架构类型

lipo -info xxx.a

6..a静态库合并

lipo -create 真机静态库.a 模拟器静态库.a -output 新文件.a

(最好指定一个目录,否则会默认当前目录)

只合并Debug版本 或者 只合并Release版本即可。

7.查看.framework库所支持的架构类型

7.1 进入到framework文件夹中

7.2 lipo -info Framework 即可

静态库编译错误

1.MRC 错误:会提示好多的autorelease,release,retain等错误

解决方案:给这个文件MRC编译 或者项目改成MRC环境

2.找不到 <libxml/HTMLparser.h>头文件 编译缺少系统库,配置:Build Settings --> 搜索Header Search Paths --> 配置 $(SDK_DIR)/usr/include/libxml2

3.framework项目,名字中不能带特殊字符 会报 test-framework is not a valid PROJECT_NAME

依赖库错误

1._SCNetWork开头

导入SystemConfiguration.framework

2._UITypeCopy开头 + _kUITag开头

导入MobileCoreServices.framework

3._defalate开头 + _inflate开头

导入 libz.tbd

4._xml开头

导入libxml2.tbd

引入静态库运行错误

1.运行崩溃

假设不是静态库内部错误,那么就设置项目的Build Settings --> Other Linker Flags --> 为 -ObjC

资源静态库.bundle

1.创建一个文件夹

2.把资源(图片,plist...)放到文件夹中

3.把文件夹后缀改为bundle就可以了

4.资源库的使用

在静态库中,我们获得资源的方式改为从这个bundle资源包中获得就可以了。

例如: [UIImage imageNamed:@"xxx.bundle/xxx"];

创建一个可测试的静态库

1.创建一个项目

2.给项目添加一个静态库Target

3.编译静态库

4.配置引用静态库

General --> Linked Frameworks and Libraries --> 添加静态库.a

5.运行项目 -- 这样就可以调试了.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • iOS制作framework静态库图文教程
  • IOS 静态库和Framework区别
  • iOS中封装.framework及使用的方法详解
(0)

相关推荐

  • iOS中封装.framework及使用的方法详解

    .framework是什么? 这个问题相信做iOS的都知道答案. 在我们的日常开发中,经常会用到各种已经封装好的库,比如支付宝.微信SDK等等中的库,这些库可以给我们的开发带来很大的便利.有的时候,由于工作的需要,我们需要对自己的项目进行封装,生成库,方便别人的使用.在这里就边参考好点的博客,边总结一下我们经常看到的.framework. 那什么是"库"呢? "库"是共享程序代码的一种方式!同行总结的这句话很简单也很好的说明了它的作用! 一般的分为"静态库

  • IOS 静态库和Framework区别

    IOS静态库和Framework区别 一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存. 三.iOS里静态库形式? .a和.framework 四.iOS里动态库形式? .dylib和.framework 五.framework为什么既是静态库又是动态库? 系统的.framewo

  • iOS制作framework静态库图文教程

    本文实例为大家分享了iOS制作framework静态库教程 ,供大家参考,具体内容如下 环境: 硬件:macbook air 系统:OSX EI Capitan 版本:10.11.3 xcode :Version 7.2.1 (7C1002) 最近在做ios的静态库(据说framework动态库不能上传到app store).a 和framework都做过了,这里就先说framework的制作流程: 1.首先在xcode下新建cocoa touch framework工程: 2.新建好工程后,往

  • iOS中.a和.framework静态库的创建与.bundle资源包的使用详解

    前言 开发中经常使用三方库去实现某特定功能,而这些三方库通常又分为开源库和闭源库.开源库可以直接拿到源码,和自己写的没有什么区别,我们可以最大程度的修改源码来适应自己功能.闭源库就是被发布者提前打包好的静态库或 Bundle 包,对此我们无法看到内部实现,对于其封装好的特定功能,我们也只需要调用其开放的API即可. 在正式的上代码之前,先介绍一些从网上搜集的静态库相关的基本概念,以加深对后面知识的理解 1. 库 库实际上是一种代码共享的方式,主要用于代码重用和源码隐藏,通常分为动态库和静态库.

  • iOS中生成指定大小、指定颜色的二维码和条形码方法详解

    iOS7.0之后可以利用系统原生 API 生成二维码, iOS8.0之后可以生成条形码, 系统默认生成的颜色是黑色. 在这里, 利用以下方法可以生成指定大小.指定颜色的二维码和条形码, 还可以添加背景颜色.阴影效果, 以下是具体方法. 一. 生成二维码 Avilable in iOS 7.0 and later 方法如下: #pragma mark - 生成二维码 //Avilable in iOS 7.0 and later + (UIImage *)qrCodeImageWithConten

  • 判断Unix系统及库文件是32位还是64位的详解

    判断Unix系统及库文件是32位还是64位的详解 一.查看系统32还是64位系统 bootinfo -y    查看硬件位数 bootinfo -K   查看内核位数 二.查看库文件是32位还是64位 1.使用file命令 Linux: # file libnss1_files-2.2.4.so libnss1_files-2.2.4.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped # file lib

  • C++ STL标准库std::vector扩容时进行深复制原因详解

    目录 引子 查找原因 解决方法 结论 引子 但是笔者却发现了一个奇怪的现象,std::vector扩容时,对其中的元素竟然进行的是深复制.请看示例代码: #include <iostream> #include <vector> struct Test { Test() {std::cout << "Test" << std::endl;} ~Test() {std::cout << "~Test" <

  • SpringBoot web静态资源映射实现步骤详解

    目录 静态资源映射规则 自定义静态资源映射规则 静态资源映射规则 “/**” 访问当前项目任何资源,全部找静态资源的文件夹进行映射 静态资源的文件夹包括: "classpath:/META-INF/resources/","classpath:/resources/","classpath:/static/", "classpath:/public/" 静态资源路径下的文件,可以通过地址栏直接访问. 例如:我们在在static

  • Go库text与template包使用示例详解

    目录 场景 text/template 包 基本用法 模板语法 空白字符 常用 Action 函数 总结 场景 现在的项目,基本都是前后端分离,后端只要提供Json等格式的数据就行.在这个背景下,模板渲染这个功能备受冷落,很少会在项目中用到. 虽然在 http 服务中,模板解析不常用,但日常开发中,巧妙利用模板生成代码,能使我们开发事半功倍.比如: 使用模板初始化项目.比如我们每次新建一个 http 服务,可能都需要 promethue 监控.日志等模块.每次都实现一遍不现实,(或者 copy

  • oracle中创建序列及序列补零实例详解

    oracle中创建序列及序列补零实例详解 我们经常会在在DB中创建序列: -- Create sequence create sequence COMMON_SEQ minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20 cycle; 我们的序列的最小值是从1开始,但是我们想让这种顺序取出来的序列的位数都一样,按照最大数的位数来算,我们需要8位的序列,那么我们就需要在1的前面补上7个零,只需要用下面的方法即可完成 se

  • C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)

    在加载DLL时,出现了如下的异常:未能加载文件或程序集"DMC3000, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"或它的某一个依赖项. 试图加载格式不正确的程序. 经上网查询后,其原因是x64和x86不兼容的问题.即DLL是x64的,但是VS默认生成的目标平台是x86的,因此,两者的不一致导致异常的出现. 其解决办法如下: 项目->属性->生成->目标平台->x64(与dll平台一致) 以上这篇

  • JS库之Particles.js中文开发手册及参数详解

    因为自己需要做产品,所以一个好的UI界面也是很重要的,发现这种散射的原子颗粒特效还不错,就弄了一个 官方github:https://github.com/VincentGarreau/particles.js/ demo制作器,注意可能需要FQ https://codepen.io/VincentGarreau/pen/pnlso 这个可以把你制作的demo导出 http://vincentgarreau.com/particles.js/这个可以用来尝试配置不同效果 使用方法 加载parti

随机推荐