美文网首页
二进制化(一)静态库

二进制化(一)静态库

作者: 紫荆秋雪_文 | 来源:发表于2018-05-12 18:20 被阅读30次

一、静态库简介

1、什么是库

  • 库:是一种程序代码的集合,是共享程序代码的一种方式

2、库的分类

  • 开源库

    • 公开源代码,能看到具体实现
    • 比如AFNetworking
  • 闭源库

    • 不公开源代码,是经过编译后的二进制文件,看不到具体实现,只会暴露接口使用。商业级的代码一般都是以这种形式提供使用
    • 主要分为:静态库 和 动态库
  • 静态库的存在形式

    • .a文件类型的静态库
    • .framework文件类型的静态库
  • 动态库的存在形式

    • .dylib 或 .tbd文件形式存在
    • .framework形式存在

3、静态库和动态库的区别

  • 静态库

    • 静态库在链接时,会被完整的复制到可执行文件中,被多次使用,就会有多分拷贝。
  • 动态库

    • 动态库则不会被复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序公用,节省内存。
    • !!!但是,项目中如果使用到自己的动态库,是不允许上架的。
    • 系统使用的库就是动态库(UIKit)

4、静态库使用场景

  • 为了保护自己的核心代码
    • 商业级SDK,保护核心技术,同时又希望更多的程序员来使用其技术,因此采用“闭源”的方式(如:支付宝、微信、友盟)
  • 将MRC的项目,打包成静态库,可以在ARC下直接使用,不需要配置
  • 提高工程的编译速度

5、静态库使用形式

  • .a文件+.h文件,看不到具体实现的代码

二、静态库制作

1、创建静态库

创建静态库.png 静态库初始状态.png

2、编写代码

#import "RevanStaticLib.h"

@implementation RevanStaticLib

+ (void)revan_Log {
    NSLog(@"来自静态库的 Log");
}
@end

3、编译产生.a静态库文件

编译后生成静态库文件.png 4、使用静态库 使用静态库.png

4、静态库所支持的架构

  • 1、查看静态库的架构
    • 进入当前静态库所在目录在终端执行
lipo -info 静态库名称.a
比如:
lipo -info libRevanStaticLib.a
查看静态库支持的架构.png
  • 所以,当前静态库可以在x86_64架构上使用

  • 2、当把模拟器换成iPhone5时,发现打出的静态库是i386架构的 模拟器iPhone5生成的静态库.png
  • 当在一个项目中使用这个静态库时,发现选择模拟器为iPhone8,项目会报错,因为当前的RevanStaticLib是一个 i386 架构的静态库,而iPhone8使用的是x86_64架构的系统,所以是不支持iPhone8的


    在模拟器iPhone8上使用i386架构的静态库.png
  • 3、所以我们在制作静态库的时候,要想这个静态库在所有的模拟器上使用必须要支持所有的架构 支持所有架构的静态库设置.png 支持所有模拟器架构的静态库.png
  • 4、此时的静态库已经可以在所有的模拟器上使用,但是在我们使用真机运行时 真机上无法运行模拟器生成的静态库.png
  • 5、制作真机静态库 生成可以在真机上运行的静态库.png
  • 6、此时静态库可以在真机上使用,但是当切换成模拟器时发现又会报错,因为此时的静态库中不包含模拟器所需的i386、x86_64架构,在使用时,当使用真机时,导入真机所需的静态库;当使用模拟器时,可以导入模拟器所需的静态库;这样显得有一点麻烦,需要来回的切换。还有一个方式是把这2个静态库合并成一个静态库

lipo -create 真机静态库路径 模拟器静态库路径 -output 合并后静态库名称
真机静态库模拟器静态库合并.png
  • 这样做虽然比较简单方便,但是会使静态库变大,差不多是真机静态库和模拟器静态库大小之和,具体采用哪种方式根据个人需求而定

  • 7、经过以上步骤所制作出来的静态库都是Debug环境下的,只需少改配置,就可以制作release环境下的静态库 制作release静态库.png

三、小结:不同机型的CPU,对应的架构不同

  • 模拟器

    • 4s - 5:i386
    • 5s - iPhone X:x86_64
  • 真机

    • 3gs - 4s:armv7
    • 5 / 5c:armv7s (armv7兼容armv7s)
    • 5s - iPhone X:arm64

相关文章

  • 07-组件二进制化

    一、二进制化 具体如何实现二进制化可以查看 二进制化(一)静态库 或者二进制化(二)Framework 二、组件二...

  • 静态库

    静态库 静态库动态库简介 .a 静态库:被编译好的二进制文件 静态库:.a, .framework 动态库: .d...

  • 组件26-二进制:二进制化-初级实践方案-如何把源码手动打包成静

    前面的22-25主要讲了:二进制化,为什么要二进制,打包静态库。 XMGDownLoad 是 源码XMG...

  • 二进制化(一)静态库

    一、静态库简介 1、什么是库 库:是一种程序代码的集合,是共享程序代码的一种方式 2、库的分类 开源库公开源代码,...

  • iOS动态库、静态库及使用场景、方式

    前面介绍过制作过程,这里不讲如何制作动态库、静态库。 静态库和动态库都是以二进制提供代码复用的代码库。 静态库常见...

  • 静态链接库

    静态链接库:一种函数库,已经是编译完毕的二进制文件,静态库后缀: windows :.lib linux: .a ...

  • 动态、静态链接库

    库(Library)就是一段编译好的二进制代码,加上头文件就可以使用。 静态库 静态链接库(Mac 下的 .a)。...

  • iOS的静态库和动态库

    静态库简介 什么是库? 原文博客地址: iOS的静态库和动态库 库从本质上来说是一种可执行代码的二进制格式,可以被...

  • 如何检测.a和.framework是否支持bitcode

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

  • iOS开发中的库

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

网友评论

      本文标题:二进制化(一)静态库

      本文链接:https://www.haomeiwen.com/subject/ghkrrftx.html