美文网首页
iOS 底层原理(一):静态库与动态库

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

作者: qinghan | 来源:发表于2021-01-23 20:52 被阅读0次

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

    什么是库(Library)?

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

    库的作用:

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

    什么是链接(Link)?

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

    什么是clang

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

    clang.png
    通过上面的描述,我们可以知道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
    命令的含义:
    命令解释.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文件的合集。同时我们也了解可执行文件是如何链接静态库的。

    相关文章

      网友评论

          本文标题:iOS 底层原理(一):静态库与动态库

          本文链接:https://www.haomeiwen.com/subject/lwnyzktx.html