• 静态库 VS 动态库


    如何得到库

    ①先写好一堆的.c文件(.c:我们所需要的各种工具函数)

    ②将这些.c编译为对应的.o

    ③将所有的这些.o打包为一个仓库文件(静态库或者动态库)

    静态库:按照静态库的方式打包

    动态库:按照动态库的方式打包

    因为打包的规则不同,所以得到库也是不同的

     

    共性与个性

    二者的共性

    都是事先做好的.o仓库。库这个东西很好,如果没有库这个东西的话,每次都要自己重复实现这些工具函数,这会非常的麻烦。eg:如果没有库提供printf的话,写个简单的helloworld,printf函数还需要自己实现,这就扯淡了。

    二者的区别

    这两种库的链接方式不同。

    静态库:静态链接,由静态链接器(collect2/ld)来实现

    动态库:动态链接,由动态链接器来实现

    静态库

    链接静态库 与 链接一般的.o没有区别

    比如,如果printf函数是由静态库来提供的话,那就需要连接printf所在的静态库。静态库是.o的集合,printf在其中的某个.o中,链接静态库时,使用printf这个符号去搜索静态库中所有的.o,如果找到了printf所在的.o,将其链接到自己的程序中。

    静态库缺点

    链接静态库时,其实就是将库中.o的代码包含到自己的程序中,每个程序链接静态库后,都会包含一份独立的代码,当这些程序都运行起来时,所有这些重复的代码都需要占独立的存储空间,显然很浪费计算机资源。

    很多人估计像我一样会有这样的疑问“假如有A.o和B.o, A.o包含了printf和scanf实现,还有其他很多函数的实现。我自己的代码中仅仅使用了printf,那么我链接静态库的时候是仅仅把printf代码包含进来还是把整个A.o代码包含进来。换句话说,静态链接的最小单位是.o还是单个函数?

    实际上只包含printf部分

    动态库

    主要是为了解决静态库的缺点而存在的。

    链接动态库

    在链接动态库时,collect2/ld不会将动态库中.o的代码直接静态链接(复制)到自己程序中,只会留下调用接口。程序运行时再去将动态库(链接)加载到内存中,然后就能调用动态库的函数(代码)了。

    动态库的优点

    不管多少程序使用了这个动态库,这些程序只会共享使用同一份的动态库,因此动态库也被称为共享库。

    疑问:动态库的代码是被全部加载到内存中的吗?

    是的,因为动态库并不知道你的程序需要使用哪个函数,所以整个动态库都会被加载到内存中。

    动态库工作的过程

    过程描述的不严谨,但是它的原理确实是这样的。程序运行起来后,“动态链接器”一看你想链接的是libc.so动态库,首先检查内存中有没有这个动态库。如果没有:到硬盘上找到libc.so库,将所有代码加载(动态链接)到内存中,并得到整个动态库在内存中的起始地址。如果有:说明之前有人已经加载过了,所以不再加载,直接得到动态库在内存中的起始地址即可。

    举例:调用动态库的prinf函数

    疑问:是怎么找到动态库中的printf函数的?
    与调用普通的函数一样,就是通过地址跳转找到。

    疑问:是怎么知道printf函数体的地址的?
    printf的地址 = printf的相对地址 + 动态库加载时的地址

    相对地址

    编译时并不知道动态库会加载到什么位置,编译器其实并不知道printf函数第一条指令的绝对地址,所以编译时printf只是一个相对地址。

    什么是相对地址?printf函数第一条指令相对于动态库头的距离。

    绝对地址

    动态链接器加载动态库后,会得到动态库在内存中的起始地址(绝对地址)。

    printf相对地址 + 动态库绝对地址 == printf的绝对地址

    如此就能调用到动态库中的printf函数。

    静态库 与 动态库的名字尾缀

    静态库名字尾缀

    ①windows:尾缀为.lib

    ②Linux:尾缀为.a

    动态库名字尾缀

    ① windows:尾缀为.dll

    ②Linux:尾缀为.so

  • 相关阅读:
    ASCII对照表
    Python学习记录-3-简明Python教程-数据结构
    Python学习记录-2
    Python新手容易遇到的问题
    python学习问题之-编码
    同步与异步的概念(转自http://blog.chinaunix.net/uid-21411227-id-1826898.html)
    Objective-c学习三
    挺有意思的人体时钟代码(转自http://ziren.org/tools/hone-hone-clock.html)
    int ,long , long long类型的范围
    css3选择器使用例子
  • 原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/9412356.html
Copyright © 2020-2023  润新知