库的简介:
库的分类:静态库和动态库,是模块化编程的一种文件类型,文件内部主要存储某个函数功能具体实现的算法代码,头文件则是对这些函数进行声明。
使用库的目的:如果他人想要使用你写的函数功能,那么你就需要将自己所写的函数模块文件给他,而你只想提供函数的使用权限,不提供文件的读写权限,就需要把功能函数文件生成静态或动态库,不仅如此,库还能够影响执行程序的大小。
总而言之,将功能函数文件(***.c)编译成库文件,实现了算法的保密和执行程序的大小,所谓执行程序的大小,比如微信应用程序的大小很大一部分取决于连接的是静态库还是动态库。
例如:
静态库:
库文件标准格式:lib****.a
使用方法:与主程序一起编译,注意要向gcc编译器指明库所在的路径,如:
//若有这三个文件:main.c calculateFun.c calculateFun.h
//main.c是主程序,是实现整个项目的窗口
//calculateFun.c是模块化文件,将加、减、乘、除四则运算的功能实现
//calculateFun.h是头文件,将四种运算函数进行声明
//说明1:主程序若要使用模块化文件里的函数,必须先对函数进行声明,所以应该先#include "calculateFun.h"头文件
//说明2:头文件名可以和模块化文件名一样,也可以不一样,只要内部是对模块化文件里的函数进行声明就行
//说明3:若只提供四则运算函数的使用权限,不提供读写四则运算实现的算法的权限,且使得可执行程序运行时速度更快,则应将模块化文件编译成静态库文件,库文件可以打开,但都是以乱码形式显示,确保了算法的保密性。
//静态库的具体实现方法:
1.gcc calculateFun.c -c //编译成.o保密文件
2.ar rcs libcalculateFun.a calculateFun.o //生产库文件标准命名的静态库文件
3.gcc main.c -lcalculateFun -L ./ -o calculate //与主程序一起编译成calculate可执行程序
4../calculate //是可以直接执行程序的
总结:
- 模块化c文件不具备保密性,需要编译成保密高的.o文件
- 再由.o文件生成静态库文件
- 静态文件除了具有保密性外,其它的跟模块化c文件差不多,gcc对主程序编译时,会连静态文件或模块化文件一起编译并且写入同一个执行程序中
- 生成的可执行程序可以摆脱静态库或模块化文件的束缚,可以单独运行,这是由于gcc在编译主程序时,已经将函数实现代码编译并写入可执行文件当中,所以会使得运算程序更加方便和高效率,但会增大执行程序的文件大小。
- 使用的是静态库或模块化文件,是不利于更改,倘若后续有对函数进行调整的需要,那么只能重新编译整个执行程序,这就会产生很大的影响,举个例子:如果微信某个功能使用的是静态库或模块化文件,微信官方后续需要对这个功能作升级,此时官方只能重新编译生成新的微信程序,用户就要删除原先的微信,重新下载,若微信文件比较大,每次这样的更新就会导致大量时间消耗在下载方面。
动态库:
库文件标准格式:lib****.so
使用方法:与主程序一起编译,注意要向gcc编译器指明库所在的路径,如:
//若有这三个文件:main.c calculateFun.c calculateFun.h
//main.c是主程序,是实现整个项目的窗口
//calculateFun.c是模块化文件,将加、减、乘、除四则运算的功能实现
//calculateFun.h是头文件,将四种运算函数进行声明
//说明1:主程序若要使用模块化文件里的函数,必须先对函数进行声明,所以应该先#include "calculateFun.h"头文件
//说明2:头文件名可以和模块化文件名一样,也可以不一样,只要内部是对模块化文件里的函数进行声明就行
//说明3:若只提供四则运算函数的使用权限,不提供读写四则运算实现的算法的权限,且使得可执行程序占用空间小,则应将模块化文件编译成动态文件,库文件可以打开,但都是以乱码形式显示,确保了算法的保密性。
//动态库的具体实现方法:
1.gcc -shared -fpic calculateFun.c -o libcalculateFun.so //编译生成动态库文件
3.gcc main.c -lcalculateFun -L ./ -o calculate //与主程序一起编译成calculate可执行程序
4.export LD_LIBRARY_PATH="动态库的具体路径" //Linux下可以在系统环境变量中为LD_LIBRARY_PATH指定一个路径,在原来基础上增加一个程序执行时寻找动态库的路径,Windows也是需要一个动态库路径,原理差不多
5../calculate //必须执行第4步后,才能执行程序
总结:
- 模块化c文件不具备保密性,需要编译成保密高的.so动态库文件
- 动态文件除了具有保密性外,与主程序一起编译时的工作方式是与静态库或模块化文件有着明显区别的,gcc对主程序编译时,只会提取关于动态文件的一些描述信息与主程序一起编译并且写入同一个执行程序中,但动态文件里的函数实现算法并不会被编译写入执行文件内。
- 这种方式有效减低可执行程序对存储空间的要求,方便用户的下载,同时若后续有对每个功能进行调整时,也不用卸载整个应用程序,只需要更新相关的动态库文件即可,方便了软件的更新。
- 使用动态库,也有着明显的缺陷,程序在执行过程中的效率也会下降,这是因为执行程序内部并没有函数实现的算法,所以当程序执行某个功能时,就需要去寻找相关的动态库文件,并且进行临时编译。那么程序如何寻找动态库文件、去哪里寻找,也是我们在执行程序时要考虑的问题。
说明:
1. -L是为gcc指一个寻找库的路径,默认会从usr/lib或usr/local/lib下
参考博文:https://blog.csdn.net/weixin_52668204/article/details/118224428