1.概念
库:
将自己写的代码封装在一个库中,方便其他人使用并且对代码还有一定的保密作用
库是一种可执行代码的二进制形式,可以被操作系统载入内存执行
linux下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,因此代码体积较小。
库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。
现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
2. 静态库的创建和使用
2.1 概念
静态库对函数库的链接是放在编译时期(compile time)完成的。
程序在运行时与函数库再无瓜葛,移植方便
浪费空间和资源,因为所有相关的对象文件(object file)与牵涉到的函数(library)被链接合成一个可执行文件(executable file)。
一般静态库的后缀名为.a,一般静态库的名字之前要加一个lib,所以静态库的库名一般为lib库名.a
2.2 静态库的创建和使用
1)生成制作库文件所需的功能函数的可重定向文件
gcc -c fun.c -o fun.o
2)生成静态库文件
ar crs libfun.a fun.o
lib 表示库文件,一般不能省略
fun 表示库的名字
.a 表示静态库
3)静态库生效
gcc main.c -o main -L. –lfun
-L 指定库的路径
-l 指定库的名字
创建实例:
![](https://img-blog.csdnimg.cn/img_convert/d784ed80fdd7439686805be11996354f.png)
使用实例:
![](https://img-blog.csdnimg.cn/img_convert/3dee0e187a4b47569c2d05c365b2ff09.png)
3.动态库的创建和使用
3.1 概念
动态库把对一些库函数的链接载入推迟到程序运行的时期(runtime)。
可以实现进程之间的资源共享。
将一些程序升级变得简单。
甚至可以真正做到链接载入完全由程序员在程序代码中控制。
动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so
针对于实际库文件,每个共享库都有个特殊的名字“soname”。在程序启动后,程序通过这个名字来告诉动态加载器该载入哪个共享库。
在文件系统中,soname仅是一个链接到实际动态库的链接。
对于动态库而言,每个库实际上都有另一个名字给编译器来用。它是一个指向实际库镜像文件的链接文件。这个时候soname是没有版本号的。
3.2 动态库的创建和使用
1)生成制作库文件所需的功能函数的可重定向文件
gcc -fPIC -c fun.c -o fun.o
-fPIC 生成与位置无关的代码(生成的动态库文件在内存上 可以自动寻找一块合适的内存区域)
2)生成动态库文件
gcc -shared fun.o -o libfun.so
.so 表示动态库文件
3)将动态库复制到/lib目录里面
sudo mv libfun.so /lib
4)gcc main.c -o main -lfun
动态库的创建实例:
![](https://img-blog.csdnimg.cn/img_convert/fa4113d7fba64e3aaae0be53f057a7f8.png)
为了让执行程序顺利找到动态库,有三种方法 :
(1) 把库拷贝到/lib目录下。
(2) 在LD_LIBRARY_PATH环境变量中加上库所在路径。
(3) 添加/etc/ld.so.conf.d/*.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。 这样,加入的目录下的所有库文件都可见。
![](https://img-blog.csdnimg.cn/img_convert/daf0ad3fe74741d992d57dd872572d68.png)
![](https://img-blog.csdnimg.cn/img_convert/01aa06e79be147559782d77b9473272c.png)