贤者善人以人,中人以事,不肖者以财。 —— 《吕氏春秋 · 赞能》
库
从使用上来说,在使用程序语言开发时有些函数已经帮我们实现了,我们要做的就是找到我们需要的函数,输入正确的参数,类似最基础的printf函数或者数学计算函数(abs:绝对值)等,但在这个过程前需要我们去部署我们的开发环境,这就涉及到了库的这个东西。
从本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
动态库和静态库
从上面已经知道我们平时的开发离不了库这个东西,如果给它再区分一下就有了静态库和动态库,静态库在windows和ubuntu下的文件后缀分别是.lib和.a,动态库的文件后缀分别是.dll和.so,由于windows和linux的本质不同,因此二者库的二进制是不兼容的,那它们到底是什么呢?
它们都是他人或自己编写的程序文件经过不同的编译方式后生成的不同的文件;那么,顾名思义,静态库所对应的目标文件会在编译链接时被链接到可执行文件中,每个可执行文件都对应一份其所使用的静态库的实例;动态库是在程序运行时用到了对应的库函数才会去调用,使用到的动态库在内存中只需要有一份实例即可。
思考
简单了解了静态库和动态库之后你认为可以在什么情况下分别去使用它们呢?
对比
静态链接库特点
- 静态库是在编译时期的链接阶段链接到可执行文件中的,是可执行文件的一部分。
- 可执行文件编译完成后其所链接的库文件中函数的更新与它无关,除非再次编译。
- 执行速度快,执行文件所需函数均在执行文件内,不需要动态调用。
- 可执行文件占用的空间和资源多。
动态链接库特点
- 动态库某个函数更新只需要将相应库工程编译即可,不需要编译完整的程序文件,便于程序的更新、部署和发布。
- 动态库仅仅是复制了一些重定位和符号表信息,程序运行时识别到相应的信息才去调用相应库,因此可执行文件占用的空间和资源少,但也会使执行速度相对慢一些。
- 部署完成后内存里只需要有一份该动态(共享)库的实例。
- 可以实现进程间的资源共享。
- 可以由程序员在程序中根据需要进行控制调用时刻,使用显示调用。
动态库和静态库各有优缺点,在开发时需要根据场景进行软件文件的部署。