动静态库的基本原理
动静态库的本质是可执行程序的“半成品”。
实际上,所有库本质都是一堆目标文件(xxx.o)的集合,库的文件当中并不包含主函数而只是包含了大量的方法以供调用,所以说动静态库本质是可执行程序的“半成品”
-
在Linux当中,以.so为后缀的是动态库,以.a为后缀的是静态库。
-
在Windows当中,以.dll为后缀的是动态库,以.lib为后缀的是静态库。
库的名称:去掉前缀lib和后缀'.a/.so'剩下的就是库名称,例如:libc.so就是C库。
库的本质就是.o文件的集合。
Linux之动态库和静态库_linux静态库和动态库-CSDN博客
静态库:
静态库是程序在编译链接的时候把库的代码复制到可执行文件当中的,生成的可执行程序在运行的时候将不再需要静态库,因此使用静态库生成的可执行程序的大小一般比较大。
1.优点:使用静态库生成可执行程序后,该可执行程序就可以独自运行,不再需要库了
2.缺点:使用静态库生成可执行程序会占用大量空间,特别是当有多个静态程序同时加载而这些静态程序使用的都是相同的库,这时在内存当中就会存在大量的重复代码。
静态库制作: 1.静态库的制作:格式 xxxx.a a.生成文件
2.ar rcs libcalcufunc.acalcufuncs.oxxx.o文件生成xxx.a静态库文件
- -I:指定头文件搜索路径。
- -L:指定库文件搜索路径。
- -l:指明需要链接库文件路径下的哪一个库。
- 实际上我们拷贝头文件和库文件到系统路径下的过程,就是安装库的过程。但并不推荐将自己写的头文件和库文件拷贝到系统路径下,这样做会对系统文件造成污染。
动态库:
动态库是程序在运行的时候才去链接相应的动态库代码的,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
在可执行文件开始运行前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。动态库在多个程序间共享,节省了磁盘空间,操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间
1.优点:节省磁盘空间,且多个用到相同动态库的程序同时运行时,库文件会通过进程地址空间进行共享,内存当中不会存在重复代码。
2.缺点:必须依赖动态库,否则无法运行。
动态库的制作:
a.gcc shared fpic calcufuncs.c o libcalc.so
-shared 指定生成动态库
-fpic 标准,fPIC选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
在/etc/ld.so.conf.d/目录下创建一个属于自己的文件,将路径写里面去,不需要其他东西
回到uselib目录下
先需要刷新动态库路径,因为现在的库路径缓存并没有将我们的myzjy.conf纳入,需要重新刷新缓存。ldconfig指令,对了我们需要提升权限才可使用该指令。
linux动态库(.so)搜索路径(目录)设置方法 - zhangzheng08pku - 博客园 (cnblogs.com)
本文档是基于学习笔记的,有引用其他作者的文章,如有冒犯,请联系删!谢谢!