【Linux】动静态库的基础知识

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++🔹Liunx
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

一、动静态链接引入

静态链接 — 利用静态库
动态链接 — 利用动态库

还记得之前讲解gcc如何生成可执行文件【预处理->编译->汇编->链接】。这里的链接就分为动态和静态链接。链接的是你的代码中用到的其他的库文件的方法,你可以直接拿来使用,但是,必须要链接上对应的库文件,才能在执行的时候,找到对应的方法。

二、问题思考

我们平常自己写过printf函数吗? 那么肯定大部分人说写过,刚才文件里还写了一个输出hello world。这其实只是使用了printf函数,它就被包含在头文件<stdio.h>。printf这个函数本身我们并没有实现,只是在用这个函数,那么这个函数在哪呢?

  • 我们要想编译一个程序,一定会包含大量的头文件。这些函数的声明和实现也在这些头文件中.(如下图,Linux中的一些头文件)在这里插入图片描述

  • 如上图中就包含了stdio.h头文件。打开这个头文件(如下图)这个头文件中包含了printf函数等许多函数的声明【使用extern关键字声明】,注意没有实现哦。那有的同学会问,没有实现咋那咋可能呢?
    在这里插入图片描述

  • 在C语言中,这些实现的源代码并不会直接给你呈现,而是以动静态库的形式存储的。我们在安装vs2019时,其实也对应安装了一些列的库,这些库占用了很大一部分内存。

  • 接下来就来看看linux下c/c++的一些动静态库(如下图)
    在这里插入图片描述

  • 补充一个后缀说明:

在Linux下:.so(动态库).a(静态库);
在Windows下:.dll(动态库 ).lib(静态库)

所以链接的时候呢,通常是从头文件中找函数的声明,再从库中找文件的实现。链接就是把我的代码和库中的代码以某种方式关联起来,形成可执行程序(.exe).

三、那么什么是动静态链接呢?

续上面所说的:

动态链接:简单理解就是,在我们写好我们C语言程序之后,有一些库函数比如printf,scanf,strlen等等,这些在被编译之时,编译器会将其替换成库中的这个函数的地址。这样在执行到这个函数的时候,编译器便可以根据这个地址找到这个库乃至找到这个函数.

静态链接

这个与动态链接不同的是:这些程序在编译时,编译器会直接将库中方法的实现,整体拷贝一份到我们的可执行程序中!而不是那个函数的地址了.但是缺点也很明显:会占用资源,想想好几份相同的代码拷贝到这里,再次运行一定占用大量的资源.当然优点是不会再依赖库。动态链接和它相反.

四、动静态链接的优缺点分析

1 .静态链接

  • 静态链接的优点:
    1、程序的启动速度和运行速度相对于动态链接快。

  • 静态链接的缺点
    1、内存的磁盘空间的浪费
    当多个进程静态链接同一个静态库时,会复制多个副本,每个程序链接静态库的时候都会链接一个副本到目标文件里,链接的进程越多,副本也就越多,在磁盘上占用的空间就会变大,程序运行的时候,也会占用内。
    2、模块更新麻烦
    一个大型项目都会有很多个独立的功能模块,项目发布出去后,后期的维护中,有一个功能模块需要修改bug,而模块又是静态模块,需要整个项目程序进行重新编译后,再发布给客户升级,升级文件的容量非常大,客户获取程序、升级程序就非常不便,需要消耗很多时间。所以静态链接给程序的更新带来很大的麻烦。

2.动态链接

  • 优点
    1、节省磁盘和内存
    与静态链接不同,多个进程动态链接同一个动态库时,不需要把动态库链接到目标文件李,但会程序运行是需要依赖动态库。再磁盘空间不会造成浪费。在内存上,也是共享一份,可以节省内存。
    2、模块更新速度快
    程序发布出去后,如果某个模块需要更新,大部分情况下只需要编译该模块,不需要编译整个工程。客户只需要获取该模块并升级就可以,非常方便。但动态库会出现版本不兼容问题,需要版本管理机制来管理。
    3、有利于程序的拓展性
    动态链接可以再程序运行的时候可以动态地选择加载各个程序模块,实现程序功能的拓展。类似“插件“,只需要加载插件就可以实现该插件功能。

  • 缺点
    动态链接相对与静态链接来说,它是以一部分性能为代价取换取它的优点的,所以动态链接会比静态链接运行的速度相对会慢一些。主要有两个原因:
    1、动态连接对于变量或者函数的访问,需要进行复杂的GOT定位,然后间接寻址,包括模块之间的调用也需要GOT定位。、
    2、动态链接是在程序运行的时候取完成的,会做一些装载工作,像地址的重新分配、符号查找、解析、重定位等。会减慢程序的启动速度。

总结: 不管是静态链接还是动态链接,都会使程序更加模块化,耦合度更小,极大促进程序的开发效率。

  • 29
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿然成长日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值