iOS 底层原理(一):静态库与动态库

我们先来了解一些概念性的问题。

什么是库(Library)?

实际上库文件就是一段编译好的二进制代码,加上头文件就可以供别人使用。

库的作用:

1.某些代码需要给别人使用,但是又不希望别人看到源码,就需要以库的形式封装,只暴露头文件。
2.对于某些代码不会进行大的改动,我们想减少编译时间,就可以打包成库。因为库是已经编译好的二进制文件,编译的时候只需要Link一下,可以减少编译时间

什么是链接(Link)?

通过链接的方式我们把静态链接的库称为静态库,动态链接的库称为动态库。
概念的东西总是一知半解,下面我们实际的操作来理解静态库
下面我们通过clang工具来手动编译链接静态库。

什么是clang

打开终端输入man clang 命令如下图:

iOS 底层原理(一):静态库与动态库_第1张图片
clang.png

通过上面的描述,我们可以知道clang实际上是CLAN是一个C、C++和Objective-C编译器,包含PROPROR。访问、解析、优化、代码生成、组装和链接-惯性导航与制导.
clang 常见一些参数

 clang命令参数:
     -x: 指定编译文件语言类型
     -g: 生成调试信息
     -c: 生成目标文件,只运行preprocess,compile,assemble,不链接
     -o: 输出文件
     -isysroot: 使用的SDK路径
     1. -I 在指定目录寻找头文件 header search path
     2. -L 指定库文件路径(.a\.dylib库文件) library search path
     3. -l 指定链接的库文件名称(.a\.dylib库文件)other link flags -lAFNetworking
     -F 在指定目录寻找framework framework search path
     -framework  指定链接的framework名称 other link flags -framework AFNetworking

下面我们通过一个案例来操作,
1.如何把文件编译称.o文件
2.如何把.o文件制作成.a
3.如何链接静态库.a文件
如下图:


iOS 底层原理(一):静态库与动态库_第2张图片
file_1.png

第一步:我们将TestExample文件编译称一个.a的静态库
在终端输入如下命令:

iOS 底层原理(一):静态库与动态库_第3张图片
命令.png

命令的含义:
iOS 底层原理(一):静态库与动态库_第4张图片
命令解释.png

最后用 ar -rc libTestExample.a TestExample.o命令将.o 转称.a

iOS 底层原理(一):静态库与动态库_第5张图片
静态库.png

第二步:将test.m 转为test.o
iOS 底层原理(一):静态库与动态库_第6张图片
截屏2021-01-23 下午8.24.45.png

命令解释:
iOS 底层原理(一):静态库与动态库_第7张图片
命令解释.png

第三步骤:生成可执行文件并链接静态库
iOS 底层原理(一):静态库与动态库_第8张图片
execute.png

最终生成可执行的mach -o文件test:
iOS 底层原理(一):静态库与动态库_第9张图片
macho.png

第四步骤:我们尝试在lldb环境运行一下test文件:
iOS 底层原理(一):静态库与动态库_第10张图片
run.png

输入 lldb 命令然后输入 r,我们可以看到终端打印的结果和代码效果一样:
iOS 底层原理(一):静态库与动态库_第11张图片
code.png

通过上面一个案例,我们了解到实际上静态库就是目标.o文件的合集。同时我们也了解可执行文件是如何链接静态库的。

你可能感兴趣的:(iOS 底层原理(一):静态库与动态库)