IOS 静态库.a 和.framework

iOS项目中 Xcode 创建.a和framework静态库 最近在整理交接文档,看到之前写的项目需要封装成静态库,之前一直没时间整理,所以整理了一下创建静态库的步骤,做下记录。 一、库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。 iOS中的静态库有 .a 和 .framework两种形式;动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式。 二、... 阅读详情

1.静态库的简介

什么是库?

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

  • 根据源代码的公开情况,库可以分为2种类型

    1. 开源库
      公开源代码,能看到具体实现
      比如SDWebImage、AFNetworking

    2. 闭源库
      不公开源代码,是经过编译后的二进制文件,看不到具体实现
      主要分为:静态库、动态库

静态库和动态库

  • 静态库和动态库的存在形式
    静态库:.a 和 .framework
    动态库:.dylib 和 .framework

  • 静态库和动态库在使用上的区别
    静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(下图所示)

    静态库

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(下图所示)

动态库
  • 需要注意的是:
    项目中如果使用了自制的动态库,不能被上传到AppStore

静态库应用的场景

保护自己的核心代码
国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用
例如:百度地图,友盟,JPush等
将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换

1.静态库的特点

.a + .h
看不到具体实现的代码

2.静态库的制作

  1. 创建项目时, 直接选择静态库(.a)
  2. 设置需要暴漏的头文件 TARGETS->Build Phases->Copy Files->把需要暴露的头文件添加进来即可

    暴露头文件
  3. 在模拟器环境下编译(得到模拟器环境下的静态库)
  4. 在真机环境下编译(得到真机环境下的静态库)

3. 静态库使用测试

  • 使用模拟器的静态库, 拖入测试工程
    使用6S模拟器进行测试, 通过
    使用真机, 编译; 失败
    使用低型号模拟器测试,; 失败
  • 测试结果分析

模拟器下的静态库和真机下的静态库不能共用
主要原因是模拟器和真机CPU架构不一样(各个模拟器型号之间架构也不一样)

  • 注意静态库所支持的架构,不同机型的CPU, 对应的架构不同;

模拟器:
4s----5 : i386
5s----6sPlus : x86_64

真机:
3gs---4s : armv7
5/5c : armv7s(armv7兼容armv7s)
5s---6sPlus: arm64

  • 查看静态库支持的架构 lipo -info 库文件
    分别选中不同的模拟器, 进行编译, 查看不同的静态库支持架构
  • 怎样一次编译支持多个架构的的静态库?
    • 问题描述:
      正常情况下, 需要选中每一个模拟器进行编译, 生成支持对应架构的静态库. 然后合并; 非常蛋疼
    • 解决方案:
      Build Settings -> Build Active -> NO

      生成都能用的静态库

4 静态库文件的版本

调试版本

1.真机-Debug版本
2.模拟器-Debug版本

  • 特点
    • 调试版本会包含完整的符号信息,以方便调试
    • 调试版本不会对代码进行优化

发布版本

  1. 真机-Release版本
  2. 模拟器-Release版本
  • 特点
    • 发布版本不会包含完整的符号信息
    • 发布版本的执行代码是进行过优化的
    • 发布版本的大小会比调试版本的略小
    • 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升

怎样生成不同版本?

项目 -> Edit Scheme -> Run -> Release/Debug 分别进行编译

生成不同的版本

如果想要一个静态库, 既可以在模拟器上运行, 也可以在真机上运行怎么做?

  • 因为静态库针对于模拟器和真机生成了不同版本(支持不同架构), 所以没法同时运行
  • 解决方案: 静态库的合并
    检测.a的类型 $ lipo -info libCZTools.a
    合并
    lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a

lipo -create 静态库1 静态库2 - outpuy 静态库名字
特点:
合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
今后在使用.a时一定注意版本

5. 静态库制作(.framework)

  1. 新建功能, 直接选择.framework静态库

    选择
  2. 编译时, 设置编译所有架构

    选择编译
  3. 默认制作的是动态库, 需要设置链接类型target -> Build Settings-> 搜索 Mach-o Type ; 改为静态库

    设为静态

编译的时候需要把我自己生成功的工具类的头文件移动到Headers的 public里面

默认
修改后

静态库打包的完整正确步骤!!

    1. 确定是静态库

.a 的肯定是静态库
.framework的需要设置链接类型 target -> Build Settings-> 搜索 Mach-o Type ; 改为静态库

    1. 确定支持模拟器或者真机中的所有架构

Build Settings -> Build Active -> NO
表示不止编译活跃的架构, 让所有的架构都编译

    1. 提供的静态库应该是release版本

项目 -> Edit Scheme -> Run -> Release/Debug 分别进行编译

.a静态库和.framework静态库的区别?

  • 1> .a是一个纯二进制文件, .framework中除了有二进制文件之外还有资源文件
    2> .a文件不能直接使用, 至少要有.h文件的配合; .framework文件可以直接使用
    3> .a + .h + sourceFile = .framework
    4> 建议使用.framework

2. 静态库开发中的常见问题

  • 问题1: 有些第三方库会使用到一些图片素材,例如公司的logo等。
    由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,可能与使用静态库的程序冲突。

解决方案
在静态库中如果要使用图片素材,会利用bundle的手段
1> 建立bundle,并且向其中添加图片
2> 创建一个类方法,返回图片
3> 编译
4> 调用方如果需要使用,需要导入 .h + .a + XXX.bundle

  • 问题2:如果用户需要导入的头文件过多怎么加?
    建议使用一个主头文件包含其他头文件, 让用户只导入一个主头文件

  • 问题3: 静态库程序怎样测试?
    静态库本身就是一个小项目, 实现某些功能, 但是这些功能在开发中也需要测试. 而测试代码又不能作为静态库的一部分
    创建复合项目
    选择target 下面的+ 号,创建一个静态库项目

创建一个可以测试的静态库

将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换

MRC环境

swift打包动态库

1 . 选择项目的时候用framework,创建语言使用swift。设置适当的版本
swift文件不是头文件,我们需要把它暴露出去。应该在class前面添加public

import UIKit

public class LogTool : NSObject
{
  public func logName()
    {
        print("动态的swift库测试")
    }
}

然后在进行编译

使用,

找到库文件 拖入我们的项目,在使用的地方倒入头文件

import UIKit
import swiftWork

class ViewController: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()
        // Do any additional setup after loading th
        LogTool().logName()
    }


}

如果出现,image not found的错误 ,需要在targets里面设置Embedded

设置为Embedded
iOS创建.a和.framework静态库,以及Bundle资源文件的使用 引言在开发中.framework静态库还是比较常见的,比如:SDK,公司间的代码合作等。我们可以把一些不愿意让别人见到的代码,用静态库的方式把它隐藏起来,只留下.h文件显示方法供编程人员使用。而.a文件出了静态库本身外,还需要引入.h文件,而.framework就不需要如此,由于.framework的方便性所以一般情况下我们见到的较多。什么是库库从本质上来说是一种可执行代码的二进制格式,可以被载入内 阅读详情

相关推荐

手把手教你用Excel自动化处理G14大额风险暴露报表(含211版模板)

本文针对G14大额风险暴露报表(含211版)手工填报效率低、易出错的核心痛点,提供了一套基于Excel VBA的完整自动化解决方案。文章详细讲解了如何构建从数据采集、清洗、关联客户识别、风险暴露计算到自动化校验与归档的完整工作流,并附有可操作的代码示例,旨在帮助银行风控人员大幅提升报表处理效率与准确性。

weixin_29304985的博客 450

iOS 静态库 [.a 和 framework]

摘要 iOS静态库 iOS静态库 .a静态库 framework静态库 目录[-] 一、什么是库? 二、静态库与动态库的区别? 三、iOS里静态库形式? 四、iOS里动态库形式? 五、framework为什么既是静态库又是动态库? 六、a与.framework有什么区别? 七、为什么要使用静态库? 八、制作静态库时的几点注意: 九、创建.a静态库 十

AntSuperMan的博客 939

FreeSWITCH实战:5分钟搞定阿里云SDM(MRCP-SERVER)语音机器人搭建(含Docker部署技巧)

本文详细介绍了如何利用FreeSWITCH与阿里云SDM(MRCP-SERVER)快速搭建高可用语音机器人,包括Docker部署技巧、系统调优及高可用架构设计。通过实战案例和优化建议,帮助开发者5分钟内完成部署,提升语音交互系统的性能和稳定性。

stone的博客 504

iOS开发:iOS的静态库和动态库 【.a 和framework】的说明及博客汇总

2、图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。4、如果一个静态库很复杂,需要暴露的.h比较多的话,就可以在静态库的内部创建一个.h文件(一般这个.h文件的名字和静态库的名字相同),然后把所有需要暴露出来的.h文件都集中放在这个.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出来就可以了。Swift 制作静态库:Swift 制作静态库_酸柠檬的博客-优快云博客_swift 静态库。

feelinghappy的专栏 2381

GBT 27930-2015/2023国标充电协议A类CAN报文ID说明

国标充电CAN的ID,仅供学习参考。

qqq080的博客 7810

泛微OA E9文档管理优化:临时文件清理与存储配置指南

本文深入解析了泛微OA E9系统性能下降的常见原因——临时文件堆积,并提供了完整的优化配置指南。文章详细介绍了临时文件的产生机制,并手把手指导管理员如何通过修改存储路径、调整保留时间、设置白名单等关键配置,有效清理与管理系统临时文件,从而释放存储空间,提升系统运行效率与稳定性。

tree8的博客 431

iOS架构-静态库.a 和.framework的区别(0)

原文网址:https://my.oschina.net/kaqijiang/blog/649632 一、什么是库? 库是共享程序代码的方式。 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。 iOS中的静态库有 .a 和 .framework两种形式;动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式。...

沐雨07的专栏 804

NVIDIA GR00T SONIC - 人形机器人强化学习全身控制入门教程(一)

SONIC 是一个类人行为基础模型,它为机器人提供了一套从大规模人类动作数据中学习而来的核心运动技能。与为每个动作单独构建控制器不同,SONIC 将动作追踪作为可扩展的训练任务,因此单一套统一策略即可产生自然的全身运动,并支持多种多样的行为。         🎯 主要特点: 🚶 自然的全身运动(行走、爬行、动态动作) 🎮 支持实时 VR 遥操作 🤖 高级规划与交互的基础 📦 即用型 C++ 推理栈

2506_90492529的博客 841

iOS架构-制作静态库.a和.framework 的相互依赖(10)

有一句名言:当你知道的东西越多,你才会发现你不懂的东西越多。 现在我有点体会到了,当我去了解静态库,我发现我要学习脚;当我接触编译C/C++库,我发现我要去了解交叉编译;当我想了解组件化架构,我发现我要去理解cocoapods管理;… 你所处的环境越大,你的视野也就越宽阔。 前面9篇文章介绍了 .a 静态库的制作、.framework 静态库的制作、.a 依赖第三方.a 静态库制作以及 .fra...

沐雨07的专栏 1290

VMware Horizon 8 2111 部署系列(九)创建即时克隆桌面池

即时克隆桌面池是在 vCenter Server 中使用 vmFork 技术(称为即时克隆 API)从最佳配置映像创建的自动桌面池。即时克隆共享同一个基础映像虚拟机,使用基础映像虚拟机的快照创建的,它使用的存储空间也少于完整虚拟机。 即时克隆始终保持开机状态,并在注销后从当前发布的映像重新创建。...

白昼的技术专栏 4043

《一》:LBE,VR 大空间系列——场景环境需求解析

当前,大量 VR 体验活动在室内场地开展。因此,对于场地照明有特定要求:除天花板外,场地的所有表面均需有照明覆盖。这是为了保证玩家无论处于场地的哪个位置,地面与墙面都不会出现明显的影子。场地内不建议安装射灯或高强度的点光源,若已安装此类灯具,需使用柔光板进行遮盖。此外,要避免在阳光下使用 VR 设备台。参考图(请忽略其中Maker标签)

unitygroup的博客 944

iOS - 静态库.a 和 framework 详解

一、基本概念 1.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库。 2.静态库与动态库的区别? (1)静态库:之所以叫做静态,是因为静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。 静态库的好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大。被多次使用就有多...

weixin_33810302的博客 320

项目实战第四十七讲:易宝支付对接详解(保姆级教程)

本文是项目实战第四十七讲,易宝支付对接详解。1、xxl_job 接入fix;2、支付接口,将thirdOrderNo赋初始值,并将数据库中third_Order_No设置为非空;3、性能提效:将深拷贝改为字符赋值,提升程序性能;先不改动。

Jet_qi的博客 2680

iOS静态库(.a 和framework)

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

zhouleizhao的专栏 856

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

weixin_39575047的博客 471

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ios .a静态库和framework静态库的创建以及使用

简介 什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为 2 种类型 开源库 公开源代码,能看到具体实现 比如 SDWebImage 、 AFNetworking 闭源库 不公开源代码,是经过编译后的二进制文件,看不到具体实现 主要分为:静态库、动态库 静态库和动态库 静态库和动态库的存在形式

冰清雪酷的专栏 643

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

iOS静态库 【.a 和framework】【超详细】

摘要: iOS静态库 一、什么是库? 库是共享程序代码的方式。 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。 iOS中的静态库有 .a 和 .framework两种形式;动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式。 二、静态库与动态库的区别? 静态库: 链

黑码哥的技术博客 4226

iOS静态库(.a 和framework)

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

weixin_33713350的博客 90

关于iOS封装.a和.framework静态库的总结

先老生常谈一些基本知识点: 静态库:.a和.framework 动态库:.dylib和.framework .a是一个纯二进制文件,.framework中除了有二进制文件外还有资源文件 .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用 .a + .h + sourceFile = .framework(静态的) 相信大家都遇到过需要将现有的代码打包成...

ddlDuan的博客 576

iOS 静态库(.a和.framework)创建

iOS程序中为了保持多个项目代码的互用或者提供自己代码给别人执行又不想暴露自己的源码,通常采用建立静态库或者动态库的方式,今天我就介绍下这两个库的建立以及使用 目录 一、.a库的创建以及使用: 1、基本创建: 2、oc工程调用: 3、swift工程调用: 二、.framework创建以及使用: 1、工程外创建引用 1.1、工程外创建: 1.2调用:直接framework包拖入调用...

wokuaab_q的博客 1260

【转】iOS静态库 【.a 和framework】【超详细】

原文网址:https://my.oschina.net/kaqijiang/blog/649632 一、什么是库? 库是共享程序代码的方式。 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。iOS中的静态库有 .a 和 .framework两种形式;动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式。 ...

weixin_34026276的博客 98

iOS开发中静态库制作 之.a静态库制作及使用篇 + iOS framework静态库中使用xib和图片资源详解

iOS开发中静态库制作 之.a静态库制作及使用篇 原文:https://www.cnblogs.com/mtystar/p/6082363.html iOS framework静态库中使用xib和图片资源详解原文:https://www.cnblogs.com/zhanglinfeng/p/5510717.html iOS开发中静态库制作 之.a静态库制作及使用篇 iOS开发中静态库...

酸柠檬的博客 543

iOS创建.a和.framework静态库,及Bundle资源文件的使用

引言 在开发中.framework静态库还是比较常见的,比如:SDK,公司间的代码合作等。我们可以把一些不愿意让别人见到的代码,用静态库的方式把它隐藏起来,只留下.h文件显示方法供编程人员使用。而.a文件出了静态库本身外,还需要引入.h文件,而.framework就不需要如此,由于.framework的方便性所以一般情况下我们见到的较多。 什么是库 库从本质上来说是一种可执行代码的二进制格式...

baidu_37366055的博客 1678

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

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

weixin_30471065的博客 171

iOS:Xcode7下创建 .a静态库 和 .framework静态库

Xcode7 中创建静态库:.a 和 .framework 一、简单介绍 1.什么是库?   库是程序代码的集合,是共享程序代码的一种方式 2.库的分类   根据源代码的公开情况,库可以分为2种类型   (1)开源库     公开源代码,能看到具体实现     比如SDWebImage、AFNetworking   (2)闭源库     不公开源代...

dienangpiao2051的博客 199
上一篇: IOS 应用程序互相跳转
下一篇: IOS 内存分析 Xcode
I微微一笑I
博客等级 码龄11年 0粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值