【问题标题】:Is all code compiled and included on the final binary?是否所有代码都已编译并包含在最终的二进制文件中?
【发布时间】:2017-07-10 20:00:04
【问题描述】:

假设我创建了一个包含数百个方法的类扩展,并将该类包含在我的项目中。

现在假设从那个扩展中,我只使用 2 或 3 种方法。请记住,类扩展有数百个方法。

当我编译代码时,二进制文件中会包含什么?

只是我从该类扩展中使用的方法还是所有方法,包括该特定项目未使用的方法?

【问题讨论】:

  • 取决于您是使用静态链接还是动态链接。在动态链接中,仅包含使用过的符号名称。在静态链接中,如果您使用--no-whole-archive 之类的选项,则只会包含使用过的.o 文件。否则,将包含整个 .a 文件。另请注意,不仅会调用您直接使用/覆盖的方法。这也是关于 vtables 和其他东西的。
  • 谢谢。请将此作为答案,以便我接受。

标签: class compilation binary


【解决方案1】:

这可以分为三类:

  • 动态(共享)链接
  • 静态链接,GNU ld 中的--whole-archive
  • 静态链接,GNU ld 中的--no-whole-archive

(其他链接器可能有类似的选项)。

动态链接

代码将只包含您正在扩展的库中的方法名称。

静态链接,整个存档

糟糕...其他类的整个代码都将包含在内。

静态链接,没有整个存档

仅包含您使用的目标文件。我建议,对于大型类,您尽可能拆分源代码。

使用的方法

尽管您明确使用了这些方法,但每个扩展/覆盖都需要一些符号,例如 vtable。请参阅您的编译器文档。

【讨论】:

  • 抱歉延迟接受。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
  • 2020-01-10
  • 1970-01-01
  • 2022-01-24
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多