【Linux】函数库——静态库和共享库

库文件

1、库文件:将用户写好的程序打包成一个整体,当其他模块或者其他用户使用时,只需有这个库文件。即特定功能的实现,为用户提供一些调用接口
2、在此我们说的都是Linux下的,当然Windows下也有库文件。
3、存在的意义
库是别人写好的现有的,成熟的,可以直接来调用的代码,但是不能看到源代码的,只要遵守许可协议即可。
共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

(一)静态库

1、定义
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,后缀名一般为“.a”
2、静态链接
优点:对库依赖性低,可移植性强
缺点:可执行程序体积大
3、把功能代码编译成中间文件

gcc -c *.c  ——>  *.o

4、命令

ar crv libxxxx.a  *.o//xxxx为自己定义的名称

3、使用

gcc -o main main.c -L库的存储路径 -l库文件的名称//也就是上面的xxxx
//如果没有给库的存储路径,则会在默认的路径(/lib和 ./lib)下进行查找

(二)动态库(共享库)

1、定义
动态库是由操作系统动态加载库文件到内存上去执行,最后生成的程序中没有库文件中的内容,后缀名一般为“.so”
2、gcc在编译时默认使用动态库
3、完成链接后,gcc就可生成可执行文件
4、动态链接:有需要库时跳转至库中执行后返回
优点:可执行程序体积小
缺点:效率低、对库的依赖性强、一旦库缺失则无法编译
4、gcc默认生成的二进制程序是动态链接的,可通过file命令验证
5、生成共享库

gcc -shared -fPIC -o lib__.so 源文件列表

6、通过LD_LIBRARY_PATH环境变量给操作系统指定加载共享库的路径
(1)直接在终端上修改
export LD_LIBRARY_PATH=库的绝对路径仅对当前终端有效,当终端关闭或者系统重启,则设置的环境变量就不存在了
(2)如果想让其永久有效,则将export LD_LIBRARY_PATH=库的绝对路径添加到用户家目录下的 .bashrc 文件中,修改配置文件 /etc/bashrc
(3)将生成的共享库存储到系统默认的搜索路径下 /lib /usr/lib
7、使用

gcc -o main main.c -L库的存储路径 -l库文件名称

(三)静态库和动态库(共享库)的区别

1、静态库类似于中间文件的集合,是不可执行的,而共享库是一个不能自己单独执行的可执行的可执行文件。
2、共享库在程序运行时,由操作系统单独加载执行。
2、静态库是在链接时,将静态库中的内容合并到最终的可执行文件中,所以程序执行时,不需要依赖静态库。最终生成的可执行文件中就包含了静态库方法的实现。
3、更新库中的功能
(1)若为静态库,必须更新编译可执行文件
(2)若为动态库,只需要更新共享库就可以了

(四)总结

1、静态库是在程序的链接过程中被复制粘贴到目标文件,因为静态库被链接后库就直接嵌入可执行文件中了,那就会产生一个问题,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个静态库的副本,这样会浪费系统空间。
2、共享库是在程序运行时由系统动态加载到内存中供程序调用,这样就避免了每个目标文件都有一个副本库的问题。使用动态库的优点是系统只需载入一次动态库,不同的程序可以使用内存中相同的动态库的副本,因此节省了很多内存。
3、静态库如果出现bug,则要把每个可执行文件找出来一 一进行修改。
4、动态库如果出现bug,只需要将动态库的库文件找出来修改即可。
5、静态库在程序链接时会被连接到目标代码中,程序运行时将不再需要该静态库。
6、动态库是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

(五)具体操作

1、静态库的使用
【Linux】函数库——静态库和共享库_第1张图片
2、具体操作
【Linux】函数库——静态库和共享库_第2张图片
3、动态库的使用
【Linux】函数库——静态库和共享库_第3张图片
4、具体操作
【Linux】函数库——静态库和共享库_第4张图片
5、如果要改变函数中的数据,需要重新更新静态库(ar操作)以及重新链接

你可能感兴趣的:(linux)