【问题标题】:managing C++ large static library管理 C++ 大型静态库
【发布时间】:2014-08-24 14:38:49
【问题描述】:

我正在合作开发一个包含大约 100,000 行代码的 C++ 项目,这些代码紧密交织并构建成两个库:“util”库和“physics”库。生成的 lib 文件非常大,使用调试符号编译时大小为 265Mb/1.2Gb,但即使没有它们也是 161Mb/700Mb。然后将它们用于大约 30 种不同的可执行文件中。

问题在于调试变得非常困难:更改一行,然后在配备 SSD 的强大机器上生成单个可执行文件需要 30 秒。

最明显的管理策略是将 lib 文件拆分为多个。有多少,即 lib 文件的理想大小是多少?按字母顺序拆分有什么问题吗? (即所有以 a 或 A 开头的 .o 文件都转到 libphysicsA.a 等)?

【问题讨论】:

  • 一个明智的策略是将库拆分为功能的逻辑组(例如矩阵操作、转换、最小化算法,)。使用字母顺序作为拆分标准会令人困惑(并且实际上并不能保证所有函数的第一个字母具有均匀分布 :] )。无论如何,拆分可能会或可能不会导致链接稍快一些,但编译可能会花费相同的时间(假设您的构建环境支持基本的增量构建)。
  • 我同意 Eitan 关于如何拆分文件的观点。使其易于理解,并且可能链接起来也会更快。顺便说一句,可执行文件的时间主要花在编译或链接上吗?如果是编译,会不会是因为大量使用了模板?这有时会迫使大型模板类的双重编译。因为它发生在我参与的项目中...... -.-
  • bartgol,是的,大量使用模板,所以编译速度很慢,但是即使只是“ar”命令也需要一些时间,因为它需要将 Gb 转储到磁盘上。我希望有一些神奇的解决方案...... :)
  • 这个问题对于 Stack Overflow 来说似乎过于面向设计/讨论,这是针对可以有明确答案的编码的具体问题。讨论高级设计概念和最佳实践更适合Software Engineering。请阅读this meta post了解更多信息。

标签: c++ linux unix static-libraries


【解决方案1】:

你的问题是编译时间长,所以显然你必须继续拆分,直到编译时间变得令人满意。最好按其部件的含义或使用频率来拆分库。将那些主要通过含义相关或经常/不经常使用的模块放在一起。仅按字母顺序拆分会导致您的项目使用太多不同的库部分,甚至全部使用它们,从而减慢编译到初始时间值。

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 2023-03-13
    • 2023-03-28
    • 2021-08-27
    • 2011-07-31
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多