当前位置:首页 » 《关注互联网》 » 正文

【Linux】动态库、静态库

2 人参与  2024年10月31日 08:05  分类 : 《关注互联网》  评论

点击全文阅读


文章目录

1. 概念2. 制作静态库2.1 将库安装到系统2.2 将库与头文件直接拷给用户2.3 使用带路径的库 3. 制作动态库4. 理解动态库
在这里插入图片描述

1. 概念

库的本质就是.o文件的集合。

静态库:是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了,其后缀名一般为“.a”。动态库:是指在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行与运行时链接文件加载库,这样可以节省系统的开销,动态库一般后缀名为“.so”,完成了链接之后,gcc 就可以生成可执行文件。

2. 制作静态库

准备工作
在这里插入图片描述

在制作库时,通常要将源文件隐藏起来,只提供对应的.o文件,并且需要对.o文件进行打包

静态库库名规则:libxxx.o

打包的命令: `ar  -rc  lib库名.a   要打包的.o文件`其中ar = archive(存档),r = replace,c = create;如果库中已经存在同名的.o就进行替换,没有则创建。

在这里插入图片描述

未来,我要把库给别人用,只需要把头文件给他,把库文件给他即可。

2.1 将库安装到系统

那能不能将我自己写的库安装到系统里呢? - -直接拷贝即可。
在这里插入图片描述

现在,我就直接可以使用我自己写的库了
在这里插入图片描述
但是链接时为什么出错呢? - -没有指定库

选项 -l :引入指定名称的第三方库

在这里插入图片描述

2.2 将库与头文件直接拷给用户

在这里插入图片描述
但是此时链接又找不到库了
在这里插入图片描述

选项:-L 库路径 - l 库名

在这里插入图片描述
此时,该种方式也就能跑起来了。

2.3 使用带路径的库

在这里插入图片描述

此时,我们就可以将生成的库mystdc交给别人了。那别人怎么用呢?

在这里插入图片描述

选项:-I,指定头文件的路径

总结
-l:指定库名
-L:指定库所在的路径
-I:指定头文件的路径

3. 制作动态库

动态库的库名规则:libxxx.so

在我们使用gcc编译时,默认形成的是可执行文件,当前如果想形成库,需要加选项 -shared

gcc -o 目标库 源文件  `-shared`

在形成动态库所需要的.o文件时,需要设置与位置无关码选项 -fPIC

gcc `-fPIC` -c .o  .c

在这里插入图片描述

此时,我们的动态库就做好了。如果想给用户使用,仍然可以用静态库中使用的三种方式。

下面使用将库拷贝到系统中
在这里插入图片描述
此时别人就可以使用了
在这里插入图片描述

对于动态库,我们可以使用命令 ldd 可执行文件名,查询一个可执行程序依赖哪些库

在这里插入图片描述
动态库删除后程序就不能跑了
在这里插入图片描述

为什么用户使用output后的动态库,编译器可以编过,但是运行不了可执行了呢?

在这里插入图片描述

在gcc编译时,指定各种选项,是告诉编译器去哪里找;在运行时,操作系统要加载程序,但是它找不到动态库了,因此报错了。

所以,动态库是需要加载的

那么如何给系统指定路径,让库被加载呢?

直接将动态库拷贝到系统中 在系统路径下建立动态库的软连接

链接名一定要和动态库的名字相同

在这里插入图片描述
在这里插入图片描述

将自己的库路径添加到环境变量列表中

此时对第二种方式有一个疑问:为什么你系统默认就去lib64中找呢?
因为linux中,系统查找动态库,系统存在一个环境变量 LD-LIBRARY_PATH
在这里插入图片描述

那么此时,我们就可以将自己库的路径导进环境变量中!
在这里插入图片描述

配置/etc/ld.so.conf.d/,ldconfig更新

将库路径写在 etc/ld.so.conf.d目录下,该目录下存放的是一系列的配置文件,这些配置文件用于指定系统的共享库(动态链接库)搜索路径,这些配置文件通常以.conf作为文件后缀。

在这里插入图片描述


如果同时给应用程序提供动态库和静态库,它会使用哪一个呢?

gcc/g++优先使用动态库
在这里插入图片描述

如果非得使用静态库,可在编译选项中加上-static

在这里插入图片描述

如果强制静态链接,必须提供对应的静态库如果只提供静态库,但链接方式是动态链接的,gcc/g++没得选,只能阵对你的.a局部性采用静态链接

4. 理解动态库

因为动态库也都是文件,那么在运行时,也会被加载到内存中。

但进程是如何看到加载的动态库呢? - -经过页表的映射,将加载到内存的动态库的地址映射到进程地址空间中的共享区
在这里插入图片描述

多个进程依赖同一个动态库时,动态库也只需要加载一份;仅需要修改其它进程页表中动态库的映射即可,所以动态库才叫做共享库。

在这里插入图片描述


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/180268.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 林语熙周晏京(离婚后,老公天天跪求复合全集阅读)最新章节免费在线阅读_《离婚后,老公天天跪求复合全集阅读》最新热门小说 -
  • 顾绫雪嬴政《被始皇读心后,文武百官卷疯了!完结版阅读》完整版免费在线阅读_(顾绫雪嬴政)全集免费阅读 -
  • 情深意长皆成空完整版阅读(沈卿林砚辞)抖音热文_《情深意长皆成空完整版阅读》最新章节免费在线阅读 -
  • 姐姐为暴富重伤傅家金孙后火葬场了全集阅读小说(傅延江瑶)全文免费阅读无弹窗大结局_(姐姐为暴富重伤傅家金孙后火葬场了全集阅读免费阅读全文大结局)最新章节列表_笔趣阁(姐姐为暴富重伤傅家金孙后火葬场了全集阅读) -
  • 乔以诺萧瑾淮(不是你好是我好全集阅读)精彩试读_《不是你好是我好全集阅读》全本阅读 -
  • 白月光双双《重生后我成全老公和白月光,他却急了全集》全文免费阅读无弹窗大结局_(白月光双双)最新章节免费在线阅读 -
  • 苏小枫苏末小说免费笔趣阁_苏小枫苏末小说全章完本大结局
  • 死遁后他疯了最新小说全文阅读_最新免费小说沈轻洲林梦江之雪_完本小说(死遁后他疯了)
  • 免费小说《顾里宋婷婷小岳欧颖倩》已完结(顾里宋婷婷小岳欧颖倩)热门小说大结局全文阅读笔趣阁
  • 侄子为求富贵,变性后全家后悔最新小说_免费小说全文阅读(苏小枫苏末)_侄子为求富贵,变性后全家后悔苏小枫苏末小说推荐完结
  • 最新《沈轻洲林梦江之雪》小说(全集完整新上小说大结局(沈轻洲林梦江之雪))全文阅读笔趣阁
  • 拒绝嫁给姐夫后,我在八零年代暴富了(陈小棠沈正韩)阅读 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1