朋友们好,这里简单介绍一下LINUX学习中关于动态库与静态库的理解,以及站在封装和使用的角度去介绍是如何封装的?如何使用的?
一:动态库与静态库的理解
- 静态库:程序在编译链接的时候把库的代码链接拷贝到可执行文件中,程序运行的时候将不再需要静态库。
- 动态库:程序运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
我们先来理解几个问题:
1️⃣:库里面需不需要main函数?
不需要!
2️⃣:什么是链接?
就是把所有的.o文件链接形成一个可执行程序。
3️⃣:将我的所有.O文件给别人,别人可以使用吗?
可以!
4️⃣:你在使用库的时候,需要用到什么?
库文件和头文件。
二:静态库
2.1:静态库的使用
gcc 或者g++ 只认识系统库,不认识其他第三方库,所以我们想要使用对应的静态库的话,怎么做呢?
方式一:
库的安装! 也就是将对应的头文件和库文件拷贝到系统路径下!
方式二:
指定路径, 大写的-i 头文件路径 大写的-L 库路径, 小写的l指定库名!
2.2:静态库的封装
在makefile中,根据对应的依赖关系以及依赖方法生成对应的.a文件和.O文件!
ar是gnu归档工具,rc表示(replace and create)。
总结一下就是将源文件翻译成.O文件以后把所有的.O文件打包起来即可!
三:动态库
3.1:动态库的使用
编译选项:
- I:链接动态库,只要库名即可(去掉lib以及版本号)。
- L:链接库所在的路径。
示例:gcc main.o -o main -L. -lhello
方式一:
库的安装! 也就是将对应的头文件和库文件拷贝到系统路径下!
方式二:
导入环境变量的方式, 程序运行的时候,会在环境变量中查找自己需要的动态库路径–LD_LIBRARY_PATH。
关键点:我们要想使用动态库,一定要让进程找到对应的静态库,因为程序和动态库是分开加载的,属于运行时找库!
3.2:动态库的封装
- shared:表示生成共享库格式。
- fPIC产生位置无关码
- 库名规则:libxxx.so
示例: