静态库推荐的用例场景
静态库是一种最基础的二进制代码共享方式,并在动态库出现以前已经被使用了很长一段。在此期间,动态库这种更为复杂的模式逐渐成为了共享二进制代码的主流。虽说如此,我们还是会在少数应用场景中使用静态库。
在实现各种核心算法时使用静态库还是非常合适的,无论是对于一些像查询和排序这样的基本算法,还是一些非常复杂的科学或数学领域的算法。下面列出的项目能够更好地说明我们为什么要用静态库的方式来提供代码实现:
- 可以把整个代码体系结构看作“具有各种各样功能的集合”,而不是“严格定义接口的模块”。
- 实际运算并不依赖于某个特定的载入动态库的操作系统资源(比如显卡设备驱动或高优先级的系统定时器等)。
- 最终用户希望使用你的代码实现,但不想将这些内容提供给别人。
- 代码部署要求使用单文件部署的方式(即只向客户机器交付少量的二进制文件)。
虽然我们降低了构建的复杂性,但使用静态库就意味着对代码进行更加严格的控制。程序的模块化程度降低了,因此每当出现新版本的代码时,都需要对使用了这些静态库的应用程序进行重新编译。
在多媒体领域,信号处理(分析、编解码和DSP)功能一般都是以静态库的方式提供的。而用于集成的多媒体框架(DirectX、GStreamer和OpenMAX)却以动态库的方式提供,这些框架会把与算法相关的静态库集成进来。在这种设计模式中,动态库部分解决框架的通信问题,静态库解决信号处理的复杂性。
静态库使用禁忌
当你有一部分提供特定功能的代码时,你必须决定是否将其封装成静态库的形式。在本节提到的一些典型情况中,使用静态库是一种禁忌:
- 当链接一个静态库需要多个动态库时(也许除了libc以外),可能不应该使用静态库,选择使用动态库可能会比较有利。
选择使用动态库可能意味着一下几种方式:- 应该使用同一个库的已存在的动态库版本。
- 应该重建库的源代码(如果可以得到),创建动态库。
- 应该将可得到的静态库拆解成多个目标文件,这些目标文件(除了少数罕见情况外)可以用于构建动态库的项目构建中。
- 如果你所实现的功能需要存在一个类的单个实例(单例模式),由于下面良好的动态库设计实践,我们最终建议读者将代码封装成动态库而不是静态库。
- 这种情况的一个好实例是日志工具的设计。日志工具通常有一个类的单例,用在许多功能模块中,专门用于序列化所有可能的日志语句,并将日志流发送到记录媒介中(标准输出,硬盘或者网络文件等)。
如果使用动态库实现功能模块,强烈建议将日志类放在另一个动态库中。
- 这种情况的一个好实例是日志工具的设计。日志工具通常有一个类的单例,用在许多功能模块中,专门用于序列化所有可能的日志语句,并将日志流发送到记录媒介中(标准输出,硬盘或者网络文件等)。
摘自《高级C/C++编译技术》