【Linux基础】静态库和共享库(如何自定义库文件?)


前言

   Linux系统下的库文件是一组预先编译好的函数的集合,用以执行某项常见的任务。在/lib/usr/lib目录下,存储着Linux系统大部分的标准库文件。但是,当Linux目录下的标准库文件无法满足我们的要求时,就需要我们自定义库文件(静态库或共享库)。
   本篇,我们将详细介绍如何自定义静态库和共享库,以及两者之间的区别。

一、库文件的基本知识

1.库文件分类

  • 库文件通常以静态库共享库两种格式存在。

2.库文件命名

  • 库文件的文件名以lib开头,随后跟着库名,最后以库文件的类型结尾。

  • 库文件命名实例:libname.alibname.so

  • 注:.a代表传统的静态函数库,.so代表共享函数库。

二、如何自定义静态库?

1.静态库简介

   静态库是一组处于“准备好使用”的目标文件。当程序需要使用函数库中的某个函数时,只需包含一个声明该函数的头文件。编译器和链接器负责将程序代码和函数库结合在一起,组成一个单独的可执行文件。

静态库也称为归档文件(archive),以.a作为文件后缀,可用ar命令创建和维护静态库。

2.具体流程(详细步骤)

(1)首先,我们在Linux系统下使用gedit编辑工具,写下了三个代码文件,如下图所示。

在这里插入图片描述
(2)其次,我们使用终端命令,将代码文件编译成目标文件。

终端命令:gcc -c hello.c(注:-c 选项,只进行预处理、编译和汇编,不进行链接,生成.o 文件)。

(3)接着,通过ar指令打包成.a后缀的静态库。

终端命令:ar -crv libMyhello.a hello.o(注:-c 选项,创建静态库文件;-r 选项,向存档文件中插入.o文件,替换已有的任何同名文件,新成员添加到文档末尾;-v 选项,显示详细信息 )。

(4)最后,使用静态库进行编译,生成可执行文件。

终端命令:gcc -o main.c main -L./ -lMyhello(注:-L 选项,增加库的搜索路径;-lname,要搜索的库文件)。

   注意事项:打包成静态库时,文件名必须为lib+name+.a(name为静态库名)。

3.静态库缺点

   当同时运行许多应用程序,并且他们都使用同一个函数库的函数时,内存中就会有同一函数的多个副本,而且在程序文件自身中也有多份同样的副本,这将消耗大量的内存和磁盘空间
   为了避免静态库的缺点,我们可以选择使用共享库来实现函数的动态链接。

三、如何自定义共享库?

1.共享库简介

   共享库的保存位置和静态库一样,但共享库有不同的文件名和后缀(.so)。使用共享库的链接方式,能够使程序本身不再包含函数代码,而是直接引用 运行时可访问的共享代码。
   当编译好的程序被装载到内存中执行时,函数引用被解析,并产生对共享库的调用。只有在共享库需要被调用的时候,共享库才被加载到内存中

2.具体流程(详细步骤)

(1)首先,我们同样在Linux系统下使用gedit编辑工具,写下了三个代码文件,如下图所示。

在这里插入图片描述

(2)其次,我们将代码文件编译成目标文件。不同于静态库的是加入了-fPIC选项。

终端命令:gcc -fPIC -c hello.c(注:-fPIC 选项,生成位置独立的目标代码)。

(3)然后,我们输入终端命令,生成共享库。

终端命令:gcc -shared -o libMyhello.so hello.o(注:-shared 选项,进行动态编译,生成共享库文件)。

(4)接着,我们使用共享库进行编译,生成可执行文件。

终端命令:gcc main.c -L./ -lMyhello(注:-L 选项,增加库的搜索路径;-lname,要搜索的库文件)

(5)最后,我们需要将动态库拷贝到系统库目录/lib/usr/lib中,否则可执行文件找不到共享库无法运行。

终端命令:cp libMyhello.so usr/lib

   注意:步骤(2)和(3)可直接用终端命令:gcc -fPIC -shared -o libMyhello.so hello.c,若只执行步骤(1)-(4),将无法运行生成的可执行文件。

3.共享库优点

  • 共享库的更新,可以独立于依赖它的应用程序。
  • 系统可以只保留共享库的一份副本供许多应用程序同时使用,并在磁盘上也仅保存一份。

四、静态库与共享库区别

1.代码被载入时刻不同

  • 静态库:在编译时会被链接到目标代码中,程序运行时不再需要静态库,因此代码体积较大。
  • 共享库:在编译时不会链接到目标代码中,而是在程序运行时才载入,因此代码体积较小。

2.实例分析——应用程序使用静态库和共享库的区别

   若一款游戏源码采用静态库链接,当游戏需要更新时,需要重新下载整个游戏,不仅下载安装包大,耗费时间长,而且十分影响游戏体验。
   若游戏源码采用共享库链接,当游戏需要更新时,我们只需更新游戏源码依赖的共享库,即下载该游戏的补丁包,无需重新下载整个游戏


总结

   以上就是关于如何自定义静态库和共享库的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

孤生i

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

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

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

打赏作者

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

抵扣说明:

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

余额充值