小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

iOS静态库和动态库(详细库讲解)

IOS 额外说明

收录于:52天前

什么是图书馆?

库是程序代码的集合。组织N个文件是共享程序代码的一种方式。库本质上是可执行代码的二进制格式,可以加载到内存中并执行。

图书馆分类

  • 开源库:源代码是公开的,可以看到各个实现文件(.m文件)的实现,如GitHub上常用的开源库:AFNetworking、SDWebImage等;
  • 闭源库:不公开源代码,是经过编译后的二进制文件,看不到具体的实现。闭源库又分为:静态库 和 动态库

    1、Linux中静态库和动态库的区别:

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

    静态库:此类库的名称通常为libxxx.a;使用静态函数库编译出来的文件比较大,因为整个函数库的所有数据都会集成到目标代码中,而且它的优点很明显,就是编译出来的可执行程序不需要外部函数库支持因为使用的所有函数都已经编译进去了。当然,这也可能是一个缺点,因为如果静态函数库发生变化,你的程序必须重新编译。

    动态库:此类库的名称通常为libxxx.so;与静态函数库相比,动态函数库在编译时不会被编译到目标代码中。你的程序只有在执行相关函数时才会调用函数库。相应的函数,因此动态函数库生成的可执行文件较小。由于函数库不是集成到你的程序中,而是在程序运行时动态请求和调用的,所以程序的运行环境中必须提供相应的库。对动态函数库的修改不会影响你的程序,因此升级动态函数库更加方便。

    2、iOS开发中静态库和动态库的区别:

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

    静态库的好处

    1. 模块化和分工提高了代码重用和核心技术的保密性。
    2. 避免经常导致大量重新编译和链接的小更改
    3. 它还可以重复使用。请注意,它不会被共享。

    动态库的优点:

    1. 使用动态库,可以减少最终可执行文件的大小,将整个应用程序划分为模块,以团队方式工作,分工明确,影响相对较小。
    2. 使用动态库,多个应用程序共享内存中的同一个库文件,从而节省资源。
    3. 使用动态库,您可以通过更新动态库文件来更新您的应用程序,而无需重新编译和链接可执行程序。
    4. 应用插件
    5. 软件版本实时模块升级
       
    6. 在大多数其他平台上,动态库可用于在不同应用程序之间共享和共享可执行文件,从而显着节省内存。
      在iOS8之前的iOS平台上,苹果不允许动态加载第三方框架。从 iOS 8 开始,开发者可以有条件地创建和使用动态帧。这个框架称为Cocoa Touch Framework。虽然它也是一个动态框架,但它与系统框架不同。应用程序中使用Cocoa Touch Framework创建的动态库在打包提交时会被放置在应用程序主bundle的根目录下,并且会在沙箱中运行,而不是在系统中运行。 。换句话说,即使不同的应用程序使用相同的框架,框架的多个副本仍然会被单独签名、打包和加载。不过,iOS8开放了App Extension功能,可以让你为应用程序创建插件。这样主app和插件之间共享动态库还是可行的。
      Apple系统特定的框架是共享的(例如UIKit),但是我们使用Cocoa Touch Framework制作的动态库被放置在应用程序包中并在沙箱中运行

静态库和动态库的存在形式

  • 静态库:文件扩展名是.a和.framework。

  • 动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。(系统直接提供给我们的framework都是动态库!)

    理解.a 是一个纯二进制文件.framework 中除了有二进制文件之外还有资源文件。 .a ,要有 .h 文件以及资源文件配合, .framework 文件可以直接使用。总的来说,.a + .h + sourceFile = .framework。所以创建静态库最好还是用.framework的形式

静态库和动态库的区别

区别

  • 链接静态库时,会将其完整复制到可执行文件中。如果多个应用程序使用同一个静态库,每个应用程序都会制作一份副本,这样做的缺点是浪费内存。与定义基变量类似,使用这个基变量意味着数据的新副本,而不是原始定义;
  • 动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;

    共同点:
  • 静态库和动态库都是闭源库,只能拿来满足某个功能的使用,不会暴露内部具体的代码信息

    如何处理静态库

  • 链接器会将**.o**中使用的所有全局符号和未解析的符号放入临时表中,并且全局符号不能重复。

  • 对于静态库的 .o,链接器将忽略未解析符号表中未包含的任何符号。

  • unresolved symbol 类似 extern int test(); --- **.h **的 声明?

  • global symbol 类似 void test() { print("test")} --  .m 的 实现?

  • 最后,链接器将函数引用替换为函数的实际地址。

  • 如何处理动态库

  • 首先,对于动态库而言其实分 动态链接库 和 动态加载库 两种的,这两个最本质的区别还是加载时间。
    • 动态链接库:没有加载到内存中。当可执行文件被加载时,动态库也被加载到内存中。链接框架和库中设置了一些共享库。 [程序启动时启动]
    • 动态加载库:需要时使用dlopen等通过代码或命令加载。 [程序开始后]
  • 但无论是哪种动态库,与静态库相比,动态库的处理难度要大得多。由于动态库是动态的,你事先并不知道某个函数的具体地址。因此,动态链接器在链接函数时需要做很多工作。
  • 因为动态库在链接函数需要做大量的工作,而静态库已经实现处理好了。所以单纯的在所有都没有加载的情况下,静态库的加载速度会更快一点。而在 iOS开发中的“库”(一) 提到的有所不妥,正确应该是,虽然动态库更加耗时,但是对于在加载过的share libraries不需要再加载的这个前提下,使用动态库可以节省一些启动时间。

  • 而实现这个动态链接是使用了 Procedure Linkage Table (PLT)。首先这个 PLT 列出了程序中每一个函数的调用,当程序开始运行,如果动态库被加载到内存中,PLT 会去寻找动态的地址并记录下来,如果每个函数都被调用过的话,下一次调用就可以通过 PLT 直接跳转了,但是和静态库还是有点区别的是,每一个函数的调用还是需要通过一张 PLT。这也正是 sunny 所说的所有静态链接做的事情都搬到运行时来做了,会导致更慢 的原因。

     
  • 从源代码到应用程序

    单击“构建”后我们做了什么?

  • 预处理:替换宏、删除注释、扩展头文件、生成.i文件。
  • 编译:将前面的.i文件转换为汇编语言,生成.s文件。
  • 汇编:将汇编语言文件转换为机器代码文件并生成.o文件。
  • 链接:在.o文件中引用其他库的引用,生成最终的可执行文件(也可以包含多个.o文件进行链接)。
  • 相关动态库和静态库的创建

  •  创建iOS动态静态库
  • 使用自定义动态库的动态更新只能在内部(企业发布)和开发模式下使用,不能在AppStore中使用。因为在上传打包的时候,苹果会对我们的代码进行一次 Code Singing,包括 app 可执行文件和所有Embedded 的动态库。因此,只要你修改了某个动态库的代码,并重新签名,那么 MD5 的哈希值就会不一样,在加载动态库的时候,苹果会检验这个 hash 值,当苹果监测到这个动态库非法时,就会造成 Crash

    iOS如何利用框架进行动态更新!

    重要参考文件(你必须阅读它):

  • iOS使用Framework进行动态更新
  • 动态库动态更新问题

    是否可以使用动态库来动态更新AppStore上的版本?

    Framework最初是Apple内部提供的一种动态库文件格式。不过,从 WWDC 2014 开始,开发者还可以创建自定义框架来实现动态更新(绕过 Apple 商店审核并从服务器发布更新版本)。这与Apple限制列出的应用程序必须通过Apple Store审核系统的限制相冲突,因此具有自定义框架的应用程序无法在商店中列出。但是,如果您正在为企业开发内部应用程序,您可能会考虑尝试动态更新技术。将多个独立的应用程序或功能模块集成到一个应用程序中! (我开发的是一个公司内部使用的App,我们把公司官网版块开发成四个独立的App,然后转换成框架文件,最后整合成一个平台级的App来使用,这样就可以可在一个应用程序中使用。使用原始 4 个应用程序的所有功能!)

  • 马赫-O

  • 制作框架时需要选择此 Mach-O 类型。
  • Mach 对象文件格式的缩写,一种用于可执行文件、目标代码、动态库和核心转储的文件格式。作为 a.out 格式的替代方案,Mach-O 提供了更大的可扩展性以及对符号表中信息的更快访问。

转自:https://www.cnblogs.com/junhuawang/p/7598236.html

. . .

相关推荐

额外说明

注释23-Lambda&方法参考

1.Lambda表达式 1.1体验Lambda表达式【理解】 案例需求 启动一个线程,在控制台输出一句话:多线程程序启动了 实现方式一 实现步骤 定义一个类MyRunnable实现Runnable接口,重写run()方法 创建MyRunnable类的对象

额外说明

PyQt5可视化 7 饼图和柱状图实操案例 ①Qt项目的创建

目录 一、新建Qt项目 二、添加组件和布局 三、添加资源 1. 新建资源文件

额外说明

C++ 重载、重写、重定义的区别

#include <iostream> using namespace std; class Parent01 { public: Parent01() { cout << "Parent01" << endl; }

额外说明

问题随记 —— Ubuntu 中启用 ssh

文章目录 问题描述 解决方法 问题描述 想要通过 XShell 或者 Putty 等软件远程连接 Ubuntu 解决方法 ① 安装 openssh-server 软件包 sudo apt update sudo apt install openssh-s

额外说明

scss与sass介绍

文章目录 CSS : sass scss 与sass scss 与sass的使用 CSS : 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等

额外说明

VueRouter报错This application has no explicit mapping for /error, so you are seeing this as a fallback

站点发布到Web服务器上,刷新报如上错。 原因:与 Vue Router3 的 mode 配置有关,默认是 hash 模式,配置成 history 模式。开发环境没问题,但发布出现的。 官网说明: 详见此处 解决: 方案一:屏蔽即可,默认就是 hash

额外说明

error:Could not initialize class net.sf.cglib.proxy.Enhancer

出错的原因都是:asm.jar   1.因为可能多了一个asm.12.jar 和asm.jar 冲突。 2.如果项目类库同时存在asm.jar和asm x-x-x.jar,试试将asm x-x-x.jar删除,可能是这两个文件冲突 查看自己的工程发现:

额外说明

跨浏览器的CSS固定定位{position:fixed}

跨浏览器的CSS固定定位{position:fixed} 不知道您是否留意了,浏览本站时,浏览器右下角有一个标着top的黑色直角三角形,可以点击它返回到正在浏览的网页页眉。当滚动网页时,它的位置一直没有任何改变,您感觉它怎么样?这就是通过CSS的定位属性

额外说明

由于找不到d3dx9_42.dll文件导致游戏软件无法运行启动的问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个d3dx9_42.dll文件

ads via 小工具