静态库与共享库

💡 原文英文,约1200词,阅读约需5分钟。
📝

内容提要

静态库和共享库是C和C++编程语言中常见的两种库类型,静态库在编译时解析依赖关系,共享库在运行时解析依赖关系。共享库可以链接到共享库,静态库可以链接到共享库和静态库。共享库的依赖关系不会成为消费者可执行文件或消费者静态库的一部分,静态库会增加消费者可执行文件或消费者静态库的大小。共享库使得消费者可执行文件或消费者共享库更加灵活和易于更新,静态库使得消费者可执行文件或消费者静态库更加便携和易于分发。

🔎

延伸解读

链接规则的实际约束

文章指出共享库只能链接共享库,而静态库可以链接共享库或静态库。这意味着在构建依赖链时,如果底层库只有静态版本,上层共享库将无法直接链接它。开发者需要根据依赖类型提前规划库的形态,避免因链接限制导致构建失败或需要重构。

依赖解析时机的影响

静态库依赖在编译时解析并成为消费者的一部分,共享库依赖在运行时解析且不进入消费者。这直接影响了可执行文件的独立性和部署要求:静态链接的产物不依赖外部库文件,而动态链接的产物在运行时必须能找到对应的共享库,否则会加载失败。

用 ldd 验证依赖关系

文章通过 ldd 命令展示了三种构建方式的实际依赖:全共享链接的可执行文件同时依赖 rectangle 和 shape 共享库;静态 rectangle 链接共享 shape 时只依赖 shape 共享库;全静态链接则完全不依赖这两个库。删除共享库文件后的运行结果进一步验证了这些依赖差异。

空间与更新的权衡

共享库可被多个消费者共用,节省磁盘和内存,且更新时无需重新编译消费者。静态库则使产物更便携易分发,但会增大体积,且同一静态库在多个消费者中重复包含,可能浪费空间。选择时需根据分发场景和更新频率权衡。

❓

Q&A

静态库和共享库有什么区别?

静态库在编译时解析依赖关系,而共享库在运行时解析依赖关系。

使用静态库的优缺点是什么?

静态库使可执行文件更便携和易于分发,但会增加其大小。

共享库的优势是什么?

共享库使可执行文件更灵活,易于更新,并节省磁盘空间和内存。

如何构建静态库和共享库?

可以使用CMake构建静态库和共享库,通过设置不同的库类型来实现。

静态库和共享库的依赖关系如何处理?

静态库的依赖关系在编译时解析,成为可执行文件的一部分;共享库的依赖关系在运行时解析,不会成为可执行文件的一部分。

如何检查可执行文件的依赖关系?

可以使用ldd命令检查可执行文件的依赖关系,静态库的依赖不会显示。

🏷️

标签

➡️

继续阅读