库不是仅标题的原因是什么?

What is the reason for a library to not be header-only?

本文关键字:是什么 标题      更新时间:2023-10-16

我真的很喜欢使用仅标头库,因为它们非常易于使用(没有链接器问题或必须单独编译库)。例如,大多数 Boost 库都是仅标头的。但话又说回来,有些部分,比如boost::p ython,需要先构建。这是设计选择还是技术需要?

我以 Boost 为例,但如果可能的话,我希望得到更笼统的答案。

使用编译库的最初原因是为了节省编译时间。图书馆可以很大。它们可能是巨大的。

另一个论点是它们将源代码分开。宇宙中仍有很多东西不是开源的。

只支持标题:

  • 减少设置/导入时间
  • 没有链接问题

仅针对标头:

  • 标头之间的冲突无法通过它们之间的编译时防火墙解决
  • 无法隐藏依赖关系
  • 增加包含其标头的每个目标的编译时间
  • 添加到从目标导出的符号堆。您的简单测试文件现在可以导出几千个符号。
  • (在极端情况下)可能会减少 COMDAT 可折叠符号之间的分离,从而导致符号的多个副本无法从目标输出文件中移除,从而导致膨胀。这应该只发生在 ELF 上的 32k+ 符号处,但在其他目标(例如 Mach-O)上发生得更早。