当前位置: 首页 > news >正文

一文说清:C静态库与动态库的区别

一 前言

大家在用C语言编程时,一定会遇到各种库,它们为开发者提供了大量的预编译函数和数据结构,从而极大地提高了软件开发的效率。

在C语言中,库主要分为两种类型:

  • 静态库(Static Library):通常具有.a或.lib的扩展名。
  • 动态库(Dynamic Library):在Windows系统中通常具有.dll(Dynamic Link Library)的扩展名,在类Unix系统中则通常具有.so(Shared Object)的扩展名。

这两种库在程序链接、加载和执行过程中有着不同的行为和特点。本文将详细探讨C语言中静态库和动态库的区别。
以printf函数作为库为例。

二 区别

区别1

静态库在目标文件链接成可执行文件阶段,库函数(库函数本身有一个代码段)链接进可执行文件(代码段)中,占了很大的内存空间。

而使用动态库时,只是在链接时做了一个printf的标记,当可执行程序运行时才会加载这段printf(从库路径中加载动态链接库.so文件),这样就节省了可执行程序的空间,只有在运行这段很短的时间会占用可执行程序的空间。

可以做个测试,写一个输出hello world的小程序,一般是Linux下gcc中是默认是使用动态库的,可以看到可执行程序a.out的大小只有7千多k,而使用静态库,链接后生成可执行程序时把printf也链接到了可执行程序中,这时候可执行程序就有700多K了。

区别2

使用动态库对库的依赖性太强,一般发布的话需要库文件(库文件要放在相应的库路径中)也发布。

静态链接库对库的依赖性不会有那么强。

静态库就像房车,出门旅游不用依赖住房,但是房车占空间。
动态库就像小车,出门旅游依赖要住酒店,但是小车省空间。

实际上使用动态库在运行的时候加载printf也会占用可执行程序,在运行时占用可执行程序的空间其实是跟静态库是一样的。

但是试想:一个可执行程序a.out中有多个文件(如a应用程序,b应用程序,c文件程序),a,b,c都需要调用printf。

使用静态库时,链接时就链接了三份printf,运行时就加载三份printf,产生多分副本,白白浪费内存。

而使用动态库时,链接时,只是将printf的标记链接进了可执行程序a,out,运行时printf只用加载一份,a调用时就是调用这一份printf,b调用时也是调用这一份printf。这才是动态库相对于静态库真正的优势!

三 总结

1 静态库

  • 链接时将程序放进可执行程序
  • 会产生多份副本
  • 不依赖程序运行

2 动态库

  • 程序运行时,才去加载动态库找函数
  • 多进程共享
  • 依赖程序运行

大家是不是清晰一些了?

http://www.lryc.cn/news/485185.html

相关文章:

  • Mysql 5.7.6以上版本怎样关闭GTID(由GTID改为基于file,position方式)
  • MATLAB常见数学运算函数
  • 设置Fusion360 - Prusa slicer -octoprint 一键打印流程
  • IO流实用案例:用字节流--输入流(Inpustream)、输出流(OutputStream)写一个拷贝图片的案例--超简单!
  • Tensorflow基本概念
  • 游戏引擎学习第九天
  • CondaError: Run ‘conda init‘ before ‘conda activate‘解决办法
  • 如何提高谷歌浏览器的稳定性
  • Spring基础之——控制反转(IOC)、依赖注入(DI)与切面编程(AOP)概念详解(适合小白,初学者必看)
  • java排序算法汇总
  • 游戏引擎中LOD渲染技术
  • 【MacOS开发环境配置与应用开发--详细教程】
  • 【回溯法】——组合总数
  • JavaScript 自动化软件:AutoX.js
  • 探索Scala编程:图书管理系统实战
  • Java之遍历List集合安全地删除元素
  • ceph的集群管理
  • STM32 设计的较为复杂的物联网项目,包括智能家居控制系统,涵盖了硬件和软件的详细设计。
  • Kettle配置数据源错误“Driver class ‘org.gjt.mm.mysql.Driver‘ could not be found”解决记录
  • 二分搜索的三种方法
  • 使用python编写工具:快速生成chrome插件相关文件结构
  • 内存、显存和GPU在Transformer架构中承担什么计算任务
  • 【计算机网络】TCP协议特点3
  • 移植LVGL8.2以及移植过程的理解
  • 动态规划-背包问题——1049.最后一块石头的重量II
  • 【C++学习(37)】并发性模式:如生产者-消费者、读写锁等。 架构模式:如MVC、MVVM等。属于23 种设计模式吗? RAII 的关系?
  • [Mysql] Mysql的多表查询----多表关系(下)
  • 命名空间(namespace)详解(一)
  • HarmonyOS ArkTs 解决流式传输编码问题
  • NPOI 实现Excel模板导出