我们先来了解一些概念性的问题。
什么是库(Library)?
实际上库文件就是一段编译好的二进制代码,加上头文件就可以供别人使用。
库的作用:
1.某些代码需要给别人使用,但是又不希望别人看到源码,就需要以库的形式封装,只暴露头文件。
2.对于某些代码不会进行大的改动,我们想减少编译时间,就可以打包成库。因为库是已经编译好的二进制文件,编译的时候只需要Link一下,可以减少编译时间
什么是链接(Link)?
通过链接的方式我们把静态链接的库称为静态库,动态链接的库称为动态库。
概念的东西总是一知半解,下面我们实际的操作来理解静态库
下面我们通过clang
工具来手动编译链接静态库。
什么是clang
打开终端输入man clang
命令如下图:
通过上面的描述,我们可以知道clang实际上是CLAN是一个C、C++和Objective-C编译器,包含PROPROR。访问、解析、优化、代码生成、组装和链接-惯性导航与制导.
clang
常见一些参数
clang命令参数:
-x: 指定编译文件语言类型
-g: 生成调试信息
-c: 生成目标文件,只运行preprocess,compile,assemble,不链接
-o: 输出文件
-isysroot: 使用的SDK路径
1. -I<directory> 在指定目录寻找头文件 header search path
2. -L<dir> 指定库文件路径(.a\.dylib库文件) library search path
3. -l<library_name> 指定链接的库文件名称(.a\.dylib库文件)other link flags -lAFNetworking
-F<directory> 在指定目录寻找framework framework search path
-framework <framework_name> 指定链接的framework名称 other link flags -framework AFNetworking
下面我们通过一个案例来操作,
1.如何把文件编译称.o文件
2.如何把.o文件制作成.a
3.如何链接静态库.a文件
如下图:
file_1.png
第一步:我们将TestExample文件编译称一个.a的静态库
在终端输入如下命令:
命令的含义:
命令解释.png
最后用
ar -rc libTestExample.a TestExample.o
命令将.o 转称.a
静态库.png
第二步:将test.m 转为test.o
截屏2021-01-23 下午8.24.45.png
命令解释:
命令解释.png
第三步骤:生成可执行文件并链接静态库
execute.png
最终生成可执行的mach -o文件test:
macho.png
第四步骤:我们尝试在lldb环境运行一下test文件:
run.png
输入
lldb
命令然后输入 r
,我们可以看到终端打印的结果和代码效果一样:code.png
通过上面一个案例,我们了解到实际上静态库就是目标.o文件的合集。同时我们也了解可执行文件是如何链接静态库的。
网友评论