ios中的静态库和动态库(代码片段)

DCSnail-蜗牛 DCSnail-蜗牛     2023-03-19     644

关键词:

什么是库

是共享程序代码的方式,库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。

库的类型

一般分为静态库动态库
静态库一般是xxx.a的形式,动态库一般在windows下是xxx.dll、在Linux下是xxx.so,在Mac下是系统的动态库是xxx.tbd(以前为.dylib)的形式。

静态库

利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

动态库

对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。

静态库与动态库的区别

静态库:在编译时完整地拷贝至可执行文件中,被多次使⽤就有多份冗余拷贝。

动态库:在编译时不需要拷贝到可执行文件中,程序运行时由系统动态加载到内存,供程序调用。

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

静态库和动态库的优缺对比

静态库优点:静态库在编译完成之后,库文件实际上就没有作用了,目标程序没有外部依赖,直接就可以运行。
静态库缺点:静态库需要拷贝至可执行文件中,所以会使用目标程序的体积增大。如果一次性加载的内容过多,会造成App启动慢。

动态库优点:系统只加载一次,就可以使多个程序共用,节省内存。
动态库缺点:动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境;如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行。

库在iOS中的形式

iOS中静态库形式:xxx.axxx.framework
iOS中动态库形式:xxx.tbd(或xxx.dylib)和 xxx.framework

.framework和.a的区别

.a是一个纯二进制文件.framework中除了有二进制文件之外还有资源文件。.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用(.h等资源已经在其内部,图片资源一般再打一个.bundle文件)。

所以 .a + .h + sourceFile = .framework。总之,也建议大家使用.framework的形式。

从源码到可执行文件

先来看看编译过程,为我后面说到的做个铺垫。当我们点击了 build 之后,做了什么事情呢?

1.预处理(Pre-process):把宏替换,删除注释,展开头文件,产生 .i 文件。
2.编译(Compliling):把之前的 .i 文件转换成汇编语言,产生 .s文件。
3.汇编(Asembly):把汇编语言文件转换为机器码文件,产生 .o 文件。
4.链接(Link):对.o文件中的对于其他的库的引用的地方进行引用,生成最后的可执行文件(同时也包括多个 .o 文件进行 link)。

以一个简单的sum文件源代码为例,介绍一下从源码到app的过程。

int sum(int a, int b) 
    return a+b;

首先,先预处理为.i文件,gcc -E sum.c -o sum.i。
再编译为汇编文件, gcc -S sum.i -o sum.s。
再汇编为二进制的.o文件,gcc -c sum.s -o sum.o。
.o文件就是C/C++编译的二进制文件,因为C/C++编译的单元编译。每一个.c/.cpp文件就是一个编译单元,把所有单元都编译好之后,再连接成一个完整的程序。

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为.a.a文件实质上就是.o文件打了个包。

动态库编译链接时,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。

iOS详细过程

Clang的任务:预处理、词法分析、语法分析、语义分析、静态分析、生成中间代码。

预处理:以#开头的代码预处理。包括引入的头文件和自定义宏。
词法分析:每一个.m源文件的声明和定义从string转化为特殊的标记流。
语法分析:将标记流解析成一颗抽象语法树( abstract syntax tree-AST)。
静态分析:包含类型检查和其他检查。
中间代码生成:生成LLVM代码。
LLVM的任务:将代码进行优化并产生汇编代码。
汇编器:将可读的汇编代码转换为机器代码,最终创建一个目标对象.o文件。
链接器的任务:把目标文件和库相连,最终输出可运行文件:a.out。

Mach-O文件

编译链接的结果应该是a.out文件的,但是有一中Mach-O文件。Mach-O是Mach Object文件格式的缩写,是mac上可执行文件的格式,目标代码,动态库,内核转储的文件格式。类似于windows上的PE格式 (Portable Executable ), linux上的elf格式 (Executable and Linking Format)。

它作为a.out格式的替代,Mach-O提供了更强的扩展性,并提升了符号表中信息的访问速度。在这里Mach-O文件其实就是a.out文件。在制作framework 的时候需要选择Mach-O Type,下面即将说到。

Mach-O Type

framework既可以是静态库又可以是动态库,gcc在编译时默认使用动态库,而且系统的framework也都是默认动态的,而我们创建的framework一般都是静态库。在Xcode中可以配置Mach-O type,为Mach-O文件设置类型,可以决定framework的类型。如下图:

Mach-O文件类型分为以下五个,整好对应上面图片中的五个选项:
Executable:应用的主要二进制。
Dynamic Library:动态链接库。
Static Library:静态链接库。
Bundle:不能被链接的tbd或dylib,只能在运行时使用dlopen()或者NSBundle动态加载,可当做macOS的插件。
Relocatable Object File:可重定向文件类型,即.m.c等文件编译出来的目标文件,文件后缀是.o

设置为Dynamic Library的framework,需要注意一点。自己编译的动态库和系统动态库在本质上是一样的,只是使用方式不一样。自己编译的动态库由于签名校验限制,只能当作静态库一样使用;系统的动态库不受签名校验限制,可以动态加载。

相关文章:
创建你自己的framework
iOS编译与app启动

静态链接库和动态链接库(代码片段)

...函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamiclinklibrary。一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库staticlinklibrary。共有两种链接方式:动态链... 查看详情

ios静态库和framework区别(代码片段)

什么是库库是共享程序代码的方式,一般分为静态库和动态库。静态库与动态库的区别静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。动态库:链接时不复制,程序运行时由系统... 查看详情

ios之深入解析静态库和动态库(代码片段)

一、库①什么是库?库就是程序代码的集合,将N个文件组织起来,是共享程序代码的一种方式。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。②库的分类根据程序代码的开源情况,... 查看详情

cgo静态库和动态库(代码片段)

CGO静态库和动态库CGO在使用C/C++资源的时候一般有三种形式:直接使用源码;链接静态库;链接动态库。直接使用源码就是在import"C"之前的注释部分包含C代码,或者在当前包中包含C/C++源文件。链接静态库和动态库的方式... 查看详情

linux下的动态库和静态库详解(代码片段)

动态库和静态库文章目录动态库和静态库静态库与动态库的概念理解动静态库如何打包动静态库与如何使用动静态库如何制作打包动态库为什么我们要使用别人(一般是顶尖的工程师写的)的代码?为了开发效率和鲁棒性(健壮... 查看详情

组件化-动态库实战(代码片段)

...组内多次沟通开始着手组件化开发,希望能改进这些开发中的痛点,成立组件化团队。组件化的方案大同小异,基础性代码封装私有库,业务组件交互交由中间件负责,项目依赖工具用iOS项目事实上的标准CocoaPods前期的基础性组... 查看详情

静态库和共享库(代码片段)

...码实现,就可以将源代码编译成库提供。库分为共享库和静态库。静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系。动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供... 查看详情

gcc编译使用动态链接库和静态链接库(代码片段)

1库的分类根据链接时期的不同,库又有静态库和动态库之分。静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。有别于静态... 查看详情

动态库和静态库(代码片段)

文章目录动静态库的基本原理初识动静态库动静态库各自特点静态库的打包和使用打包使用动态库的打包与使用使用动静态库的基本原理我们知道从源文件到可执行程序需要如下经历4个步骤预处理:完成头文件展开、去注释... 查看详情

《c语言杂记》静态库和动态库(linux版)(代码片段)

1静态库和动态库概述库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。Linux通... 查看详情

《c语言杂记》静态库和动态库(linux版)(代码片段)

1静态库和动态库概述库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。Linux通... 查看详情

动态库和静态库(代码片段)

...符号表那么符号表里都有哪些内容呢?全局变量的名字,静态局部变量的名字,函数的名字  查看详情

linux动态库和静态库(代码片段)

文章目录动静态库的基本原理认识动静态库动静态库各自的特征静态库的打包与使用打包使用动态库的打包与使用打包使用动静态库的基本原理动静态库的本质是可执行程序的“半成品”。我们都知道,一堆源文件和头文件... 查看详情

windows静态库和动态库区别

...不要用显示调用。注意:    (1)动态库中的.lib文件叫做导入库,对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。  静态库中的.... 查看详情

linux静态库和共享(动态)库的创建与使用详解(代码片段)

文章目录Linux静态库和共享(动态)库库的介绍使用库有什么好处库制作完成后,如何给用户使用静态库(staticlibrary)静态库的制作ar工具创建lib过程静态库的使用源代码静态库的优缺点优点:缺点:共享库... 查看详情

linux下c/c++编程开发静态库和动态库(代码片段)

文章目录前言一、库文件二、静态库2.1命名规则2.2静态库的制作2.3静态库的使用三、动态库3.1命名规则3.2动态库的制作3.3动态库的使用3.3.1修改环境变量3.3.2修改/etc/ld.so.cache文件列表3.3.3/lib或/usr/lib目录四、动静态库的优缺点4.1... 查看详情

linux下c/c++编程开发静态库和动态库(代码片段)

文章目录前言一、库文件二、静态库2.1命名规则2.2静态库的制作2.3静态库的使用三、动态库3.1命名规则3.2动态库的制作3.3动态库的使用3.3.1修改环境变量3.3.2修改/etc/ld.so.cache文件列表3.3.3/lib或/usr/lib目录四、动静态库的优缺点4.1... 查看详情

ios里的动态库和静态库

链接 查看详情