图书馆不header-only的原因是什么?

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

我真的很喜欢使用 header-only 库,因为它们真的很容易使用(没有链接器问题或必须单独编译库)。例如大多数 Boost 库是 header-only。但是还有一些部分,比如 boost::python,需要先构建。这是设计选择还是技术需要?

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

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

另一个论点是他们将源代码分开。宇宙中还有很多地方不是 open-sourced。

仅支持header:

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

仅针对 header:

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