如何制作并使用动静态库

🏞️1. 动静态库概念

静态库(.a):程序在编译链接时把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码

一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码

在可执行文件运行之前,外部函数的机器码由操作系统从磁盘上的该动态库复制到内存中,这个过程称为动态链接

动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间. 操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间.

🌁2. 如何制作动静态库

那么了解了动静态库的概念之后,如何制作动静态库呢?

📖2.1 制作静态库

现在,我们有一个.h文件和对应的.c文件,我们要将它们制作成静态库:

image-20221209102235157

image-20221209102344514

使用如下命令我们便可以将自己写的.c文件制作成.a静态库

image-20221209103145812

当我们给别人使用这个静态库时,不仅要给别人静态库文件,.h文件也需要,所以我们将.h.a文件一起打包:

image-20221209112719348

最终便可以生成静态库.

image-20221209112915285

📖2.2 制作动态库

使用如下命令生成.so文件.

image-20221209113007976

.so文件与.h文件一起打包:

image-20221209113207055

🌠3. 如何使用动静态库

📖3.1 使用静态库

为了使用静态库,我们创建一个test目录用于测试,并将我们的静态库拷贝到此目录下:

image-20221209113654695

mytest.c中,我们使用静态库中包含的方法:

image-20221209113913599

接着,当我们使用gcc编译mytest.c时,它会发生错误,提示我们找不到头文件和库文件,头文件的搜索路径:

  1. 在当前路径下查找头文件
  2. 在系统头文件路径下查找头文件

但我们的头文件和库文件都不在当前目录下,也不在系统路径中.

那么,如何解决这样的问题呢?

  1. 将头文件和库文件安装到系统路径中

    image-20221209115712792

  2. 指定头文件和库文件的搜索路径

    image-20221209120024138

📖3.2 使用动态库

使用动态库,与静态库一样,我们将我们制作的动态库与mytest.c放在test目录下:

image-20221209120704389

接着,我们使用刚才的指定搜索路径的方式来编译mytest.c

image-20221209121004774

可以看到,即便生成了mytest可执行程序,但依然运行不起来,这是因为动态库是程序运行时才链接,也就是程序已经加载进内存并成为进程才去链接,它需要运行时搜索,而对gcc指定路径只是编译时能够搜索到,运行时依然搜索不到.

如何解决呢?

  1. 将动态库拷贝到系统路径下,与静态库的方法一致,这里不再做演示.

  2. 通过导入环境变量的方式 – 程序运行时,会在环境变量中查找自己需要的动态库路径 环境变量 - LD_LIBRARY_PATH.

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/sss/系统编程/动静态库/mklib/lib-dyl/lib
    

    当我们导入以后再次运行:

    image-20221209122502863

  3. 修改系统的配置文件

    image-20221209124432894

    image-20221209124300686

  4. 通过软链接

    image-20221209125143027

🍁4. 动态库的加载原理

image-20221209130429223

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沉默.@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值