图书馆不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)。
我真的很喜欢使用 header-only 库,因为它们真的很容易使用(没有链接器问题或必须单独编译库)。例如大多数 Boost 库是 header-only。但是还有一些部分,比如 boost::python,需要先构建。这是设计选择还是技术需要?
我以 Boost 为例,但如果可能的话,希望得到更笼统的答案。
使用编译库的最初原因是为了节省编译时间。图书馆可以很大。它们可以很大。
另一个论点是他们将源代码分开。宇宙中还有很多地方不是 open-sourced。
仅支持header:
- 更少的设置/导入时间
- 没有链接问题
仅针对 header:
- header 之间的冲突无法通过它们之间的 compile-time 防火墙解决
- 无法隐藏依赖项
- 增加包含其 headers 的每个目标的编译时间
- 添加到从目标导出的符号堆。您的简单测试文件现在可以导出几千个符号。
- (在极端情况下)可能会减少 COMDAT-foldable 符号之间的分隔,导致符号的多个副本无法从目标输出文件中删除,从而导致膨胀。这应该只发生在 ELF 上的 32k+ 符号处,但在其他目标上发生得更早(例如 Mach-O)。