库
【1】库的概念
1.什么是库
- 库是一个二进制可执行的文件。
- 库需要被载入到内存中才能使用
- 相比较可执行的二进制程序,库是不能单独运行的。
- windows和linux都有自己的库,不兼容的。
2.库的分类
1.动态库(共享库)
2.静态库
区分:通过库的后缀来区分库的类型
windows | linux | |
---|---|---|
静态库 | *.lb | libxxx.a |
动态库 | *.lld | libxxx.so |
3.库存在的意义
库是已经写好的,成熟的,可以复用的代码。
其实我们写的很多代码,都是依赖于基础库的,例如:printf scanf
【2】静态库
1.静态库的原理
通过静态库封装功能函数,在程序编译到链接库的时候,会将函数继承到可执行程序中。
优点:
程序运行的时候与静态库毫无瓜葛,方便移植。
缺点:
浪费磁盘空间,以及内存空间。
2. 静态库的制作及使用
1)制作步骤
gcc编译: -ESc .iso
i)制作指令
$ gcc -c mylib.c -o mylib.o 完成预处理,编译,汇编;
$ ar -crs libmylib.a mylib.o 生成静态库,库名为mylib
如果有多个.o文件结合成一个库
$ ar -crs libmylib.a mylib1.o mylib2.o
ii)静态库的命名规则
以lib开头,后面紧跟库名,以.a为拓展名
例子:libxxx.a xxx就是库的名字
2)静态库的使用
格式:
gcc .c文件 -o 自定义可执行文件名 -L库的路径 -l库名
gcc main.c -o main
-L的后面紧跟的是自定义库的路径
-l的后面紧跟的是自定义库的名字
例子
gcc main.c -o main -L./ -lmylib 生成一个main可执行二进制程序
gcc main.c -lmylib 生成一个a.out可执行二进制程序
$ ar -t libmylib.a
可以查看静态库中所包含的.o文件
例子:
$ ar -t libfunc.a
func.o
【3】动态库
1.动态库的原理
动态库,把库函数的链接推迟到程序运行的时候。
当程序执行到库函数时,会去找动态库。如果内存中不存在该动态库,则会将动态库加载到内存中。
如果内存中已经存在该动态库,则会直接调用库函数。
优点:
可执行程序运行的时候,节省内存空间。可执行程序存储的时候,节省磁盘空间。
缺点:
程序运行的时候,如果没有找到动态库,会导致程序崩溃。
2.动态库的制作
1)制作步骤
i)制作指令
$ gcc -fPIC -Wall -c mylib.c -o mylib.o
$ gcc -shared -o libmylib.so mylib.o //生成一个名字为 mylib 的动态库
如果有多个.o文件结合成一个库
$ gcc -shared -o libmylib.so mylib1.o mylib2.o
ii)动态库的命名规则
以lib开头,后面紧跟库名,以.so为拓展名
例子:libxxx.so xxx就是库的名字
2)动态库的使用
格式:
gcc .c文件 -o 自定义可执行文件名 -L库的路径 -l库名
gcc main.c -o main
-L的后面紧跟的是自定义库的路径
-l的后面紧跟的是自定义库的名字
例子
gcc main.c -o main -L./ -lmylib 生成一个main可执行二进制程序
gcc main.c -lmylib 生成一个a.out可执行二进制程序
$ ldd main
linux-gate.so.1 => (0xb7793000)
libfuncso.so => not found
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75cd000)
/lib/ld-linux.so.2 (0xb7794000)
3)调用自定义动态库
1.把库拷贝到 /usr/lib或者/ lib下
$ sudo mv libfuncso.so /usr/lib/
/usr/lib 一般存放的是,用户自己写的库
/lib 系统提供的库
2.在LD_LIBRARY_PATH这个环境变量中,加上库所在的路径
例子
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linux/mydir/6_DC20101/3_lib
注意:只在当前终端有效
3.在/etc/ld.so.conf.d/目录下创建一个以 .conf为拓展名的文件.
将动态库所在位置的绝对路径添加到.conf文件中。
执行ldconfig刷新。
1)$cd /etc/ld.so.conf.d/
2)$sudo touch my.conf
3)$ sudo vim my.conf
4)填入动态库的绝对路径,注意:每一行只能写一个动态库的路径
5)保存退出
6)$sudo ldconfig
【4】总结
1.静态库
1)以libxxx.a命名
2)在可执行程序编译的时候,直接将静态库结成到可执行程序中,因此可执行程序比较大。
3)可执行程序在运行的时候占内存比较大。存储的时候,占磁盘空间比较多。
4)给程序更新部署带来麻烦
5)编译后的可执行程序,脱离静态库后不受影响
2.动态库
1)以libxxx.so命名
2)在可执行程序编译的时候,不会链接动态库,而是在程序执行的时候,将动态库加载到内存中。
因此,可执行程序比较小。
3)占用内存和磁盘空间比较少
4)程序更新部署比较方便
5)编译后的可执行程序,脱离动态库后,会崩溃