热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS开发中静态库和动态库

转载注明出处:https:www.cnblogs.commtystarp6082363.html0x01静态库与动态库的区别1.静态库和动态库的存在形式上的区别

转载注明出处:https://www.cnblogs.com/mtystar/p/6082363.html

0x01 静态库与动态库的区别

1.静态库和动态库的存在形式上的区别

  • 静态库
    • .a
    • .framework
  • 动态库
    • .dylib (在Xcode 8里面,看到后缀为.tbd的库,它的本质都是.dylib文件)
    • .framework

2.静态库和动态库在使用上的区别

  • 静态库
    • 链接时,静态库会被完整的复制到可执行文件中,被多次使用就有多份冗余拷贝
  • 动态库
    • 链接时不复制,程序运行时由系统动态的加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存

0x02 静态库的应用场景


  • 制作SDK - 软件开发工具包(Software Development Kit)
    • 如"百度地图",它想让开发者在应用程序中集成百度地图,但是百度又不想公布自己的技术实现,那怎么办?
    • 百度将自己的核心代码编译成静态库,对外暴露统一的接口,开发者集成静态库,并且调用静态库即可集成
  • 公司在开发项目时的核心代码
    • 公司一般在开发一个项目时,肯定有一部分代码是核心代码
    • 如果任何人都可以拿到这个核心代码,那么一旦有人离职,公司的核心代码就会被泄漏,那么该如何防止这种情况的发生?
    • 公司一般都会抽出一部分核心团队成员,专门开发这部分核心代码,开发完成后,将核心代码编译成静态库给其他的程序员调用,核心成员一般很少会离职的,从而非核心成员即使离职也无法带走公司的核心代码

0x03 静态库 之 .a

1.如何创建.a静态库?

1.创建工程,选择Cocoa Touch Static Library创建.a静态库

创建工程

注意

  • 它只支持OC,不支持swift

2.创建项目,例如创建一个数学工具类MTYMathTools

MTYMathTools.h文件

#import @interface MTYMathTools : NSObject+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;@end

MTYMathTools.m文件

@implementation MTYMathTools+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2
{return num1 + num2;
}@end

3.把MTYMathTools工具类编译成.a静态库

  • 实际上就是把.m文件编译成.a静态库
  • 头文件(.h)我们要暴露出去
  • cmd + B编译一下,得到.a文件如下图所示

01.a文件

  • 右键Show in Finder,这时我们会在文件夹内发现一个.a文件,但是光有.a文件还不行,还需要把头文件暴露出去,否则别人拿到是无法使用的
  • 如何暴露头文件?
    • 第一种可以直接copy过去,但是一般不会这么做
    • 第二种工程内配置

02.a文件

- 把之前生成的.a文件删除,重新`cmd + B`编译一下,就会发现,文件夹内出现了我们要暴露的头文件

03.a文件



问题

解决坑1: 模拟器

  • 我们发现,上面我们创建的.a静态库只支持x86_64的CPU架构,就是说只支持iPhone 5s后的模拟器设备
  • 下面我们想让他也支持其他的模拟器设备,及支持i386CPU架构,怎么办?
  • 有的人可能会直接选择iPhone 5模拟器,编译一下,但是那样是支持i386了,但是不支持x86_64了
  • 正确做法:

07.a文件

  • Build Active Architecture Only中的Debug如果为YES,就是说只能调试当前活跃的架构,我们当前选中的即是活跃的,所以设置为No即可
  • 终端测试打印

Architectures in the fat file: libMTYMathTools.a are: i386 x86_64

  • 但是我们上面虽然解决了模拟器的bug,但是在真机设备运行时还是报错.

解决坑2: 真机

  • 选择真机编译一下
  • 发现原文件夹中多了一个文件夹,即Debug-iphoneos,这个就是真机运行时生成的.a静态库
  • 终端打印一下,看它支持哪些CPU架构

Architectures in the fat file: libMTYMathTools.a are: armv7 arm64

  • 发现支持armv7 和 arm64,支持armv7的话,那么在armv7s上也能跑,现在很少有人专门配置armv7s,因为iPhone 5和5c现在很少见了

  • 所以现在最好的做法是把我们上面支持模拟器的.a文件和这里支持真机的.a文件综合一下.
  • 如何合并两个静态库?

    • 终端命令: lipo -create 静态库1名 静态库2名 -output 新静态库名称
  • 终端执行完成后,不出意外的话会在文件夹内生成一个新静态库,我这里就仍叫做libMTYMathTools.a
  • 终端检查一下它支持哪些cpu架构

Architectures in the fat file: libMTYMathTools.a are: armv7 i386 x86_64 arm64

  • 发现现在我们这个新的.a静态库已经支持所有模拟器的设备和真机设备的CPU架构了
  • 大功告成!

推荐阅读
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • 最近在使用C#进行录屏,通过调用ffmpeg的cmd命令进行录制。设置的录制时长是30秒,但实际只录制了11秒就停止了。关闭程序后,又开始录制并成功录制了30秒。请问大神,这是什么原因?附上了简单的调用程序。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 熟练掌握Spring Cloud,终于成为Java工程师的面试门槛 ... [详细]
author-avatar
weibophp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有