[Linux] 动静态库

Posted 一个正直的男孩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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: 当前动态库所在的位置

🎉🎉🎉结尾

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

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于[Linux] 动静态库的主要内容,如果未能解决你的问题,请参考以下文章

[Linux] 动静态库

Linux篇第十篇——动静态库(动静态库的介绍+动静态库的打包与使用)

Linux篇第十篇——动静态库(动静态库的介绍+动静态库的打包与使用)

Linux小练习打包并使用动静态库

Linux小练习打包并使用动静态库

linux动静态库