[Linux] 动静态库

emmm库这个只要是学编程的应该都用过吧,如C语言中的stdio……里面都是官方实现好的常用函数的集合方便我们使用,但是有时可能官方没有实现,那么就可以去找大佬的写好的库。

在这里插入图片描述


理解动静态库

简单理解,动静态库,其实就对库使用的方式,如下面的故事

假设家里没一切电子设备,这个时候需要去查资料,那么你就要去附近的网吧(动态库) ,但是有一天你和你爸说给我买个电脑方便查资料,你爸给你买了,那么查资料就可以直接在家里查(静态库)

从上面的故事直观的可以看出,动态库的成本明显比静态库成本低,但的确如此。

在这里插入图片描述

静态库其实就是直接链接,而动态库则是把代码全部拷贝到进程中,俩种方式的好坏其实一目了然:
静态库(节省磁盘与内存资源,但是依赖库,库本地库出问题则无法运行)
动态库(占用资源da2,不依赖库)

那么我如何知道使用库的方式是静态还是动态呢?

指令:ldd 就可以看到当前进程是使用那种库
如图所示:
在这里插入图片描述
后缀为so的都是动态库,则后缀为a的是静态库,且一个进程默认使用库的方式是动态的(上述结论,且是存在动态库的情况)

那我想要静态库呢?

只需要在编译的时候加一个 - static 的选项


制作动静态库

制作方式: 编译代码(预编译,编译,汇编,链接),但是不链接,然后在 “打包” 成库

静态库

生成 多个.o文件

gcc -c Add.o
gcc -c Sub.o
…………

库其实就是多个.o文件的集合,用到指令ar进行整合生成静态库
在这里插入图片描述

动态库

将.c文件编译为.o文件,但需要用到一个选项-fPIC(与位置无关码)

gcc -fPIC -c *.c

在将刚刚所编译获得的.o文件进行整合生成动态库 选项 shared

gcc -shared -o libmath.so *.o

与位置无关码

动态库的底层其实是把库的代码加载到内存中,在映射到共享区中,那么多个进程需要用动态库只需共享区进行映射即可。
在这里插入图片描述

位置无关吗其实就是动态库本身自身不会应为加载到内存中而导致自己的函数调用等地址发生改变。


使用动静态库

不管使用动静态库都需要用一下三板斧(编译生产可执行程序时)

  1. -I
  2. -L
  3. -l

在这里插入图片描述

告诉编译器除了在默认路径下找,也在我所指定的路径下寻找是否有头文件与库文件

执行
在这里插入图片描述

报错提示说找不到动态库?不是已经指明了头、库文件所在的位置了吗?其实那是编译,但是执行时找不到动态库

哪之前用库文件也是用的动态库都不需要呢?

不管是编译还是执行都会去系统默认的库文件与头文件寻找

如何运行呢?

  1. 把当前动态库的路径写到默认路径下(推荐,环境变量,关闭程序虚拟机在打开会重新更新)
  2. 把动态库导入到系统的库文件中(不推荐,或许会污染库文件,其实就是写的菜)

解决方案

expor LD_LIBRARY_PATH=$LD_LIDRARY_PATH: 当前动态库所在的位置

在这里插入图片描述

🎉🎉🎉结尾

上述所表述的就是动静态库的理解,制作,使用,希望对你会有所帮助。

在这里插入图片描述

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值