【1】库的概念
1.库是一个二进制可执行的文件;(存储功能函数)
2.库需要被载入到内存中使用
3.比较于二进制程序,库是不能单独运行的
4.每个操作系统都有自己的库,不兼容。
1.库的分类
1.静态库
2.动态库
可以通过后缀来区分静态库或者动态库
windows | linux | |
---|---|---|
静态库 | *.lb | libxxx.a |
动态库 | *.lld | libxxx.so |
2. 库存在的意义
-
库是已经写好的,成熟的,可以复用的功能代码,我们写的很多代码都是依赖于基础库
-
提高代码移植效率,可以不用移植源码,直接移植库即可;
【2】静态库
1. 静态库的原理
用静态库封装功能函数,在程序编译到 链接库 步骤,将静态库函数 继承 到二进制文件中,最终生成一个可执行二进制程序;
优点:
-
程序运行的时候,与静态库没有任何关系,可以完全脱离静态库
-
方便移植;
缺点:
-
存储的时候浪费磁盘空间
-
运行的时候浪费内存空间
2. 静态库的制作及使用
1)制作步骤
gcc -c func.c - o func.o 一步完成预处理、编译、汇编步骤 ar -crs libfunc.a func.o 生成静态库,且库的名字是func 如果有多个.o文件的时候 ar -crs libfunc.a func.o func1.o func2.o func3.o
静态库命名规则
以lib开头,后面紧跟库名,以.a结尾
例子:libxxx.a xxx是才库名
2)使用步骤
gcc main.c -L库的路径 -l库的名字 //默认生成一个a.out二进制程序 gcc main.c -L./ -lfunc gcc main.c -o main -L库的路径 -l库的名字 //生成一个main二进制程序 gcc main.c -o main -L./ -lfunc
【3】动态库(共享库)
1. 动态库的原理
动态库,把库函数的链接推迟到程序运行的时候。
当程序执行到库函数的时候,会去找动态库中的相关函数。如果内存中不存在该动态库,则会将动态库加载到内存中。
如果内存中已经存在该动态库,则直接调用动态库。
优点:
-
可执行程序运行的时候,节省内存空间。
-
程序存储的时候,节省磁盘空间。
缺点:
程序运行的时候,如果没有找到动态库,则会导致程序崩溃。
2. 动态库的制作
1)制作指令
gcc -Wall -fPIC -c func.c -o func.o 一步完成预处理、编译、汇编步骤 gcc -shared -o libfunc.so func.o 生成动态库,且库的名字是func 如果有多个.o文件的时候 gcc -shared -o libfunc.so func.o func1.o func2.o func3.o
动态库命名规则
以lib开头,后面紧跟库名,以.so结尾
例子:libxxx.so xxx是才库名
2)使用步骤
gcc main.c -L库的路径 -l库的名字 //默认生成一个a.out二进制程序 gcc main.c -L./ -lfunc gcc main.c -o main -L库的路径 -l库的名字 //生成一个main二进制程序 gcc main.c -o main -L./ -lfunc
$ ldd main linux-vdso.so.1 (0x00007ffcccbd7000) libfunc.so => not found libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7803e97000) /lib64/ld-linux-x86-64.so.2 (0x00007f780448a000)
没有配置环境变量,则会默认到 /lib/ 或者 /usr/lib/ 中寻找动态库
3)配置环境变量
-
将动态库移动到 /lib/ 或者 /usr/lib/ 目录下
$ sudo mv libfunc.so /lib/ $ sudo mv libfunc.so /usr/lib
-
在LD_LIBRARY_PATH这个环境变量中,添加上库的路径
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库的绝对路径 $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/mydir/3_81IO进程线程/3_lib/2_libxx.so
注意:只在当前终端有效
-
在 /etc/ld.so.conf.d/ 创建一个以 .conf结尾的普通文件;
将动态库的绝对路径写入到该文件中。($ pwd 可以查看绝对路径)
执行 sudo ldconfig
$ cd /etc/ld.so.conf.d/ $ sudo vim my.conf $ sudo ldconfig
注意:文件中每一行只能添加一个动态库的路径;
【4】静/动态库的区别(重点)
1. 静态库
-
libxxx.a格式命名
-
在程序编译的时候,直接将静态库继承到可执行程序中,因此可执行程序比较大
-
程序在运行的时候占用内存大,存储的时候占用磁盘大
-
可执行程序,脱离静态库后不受影响
-
程序的更新部署比较麻烦
2. 动态库
-
libxxx.so格式命名
-
可执行程序编译的时候,不会连接到动态库,而是在程序执行的时候,将动态库加载到内存中。内存中最多只有一份。
因此,可执行程序比较小
-
占用内存和磁盘比较小
-
可执行程序,脱离动态库后会崩溃
-
程序更新部署比较方便