如何避免A依赖B的两个静态库中的源代码重复?

时间:2018-06-22 06:41:20

标签: ios static-libraries

明智地构建项目,我需要构建两个iOS静态框架:

  • 提供基本功能的libA,
  • 一个libB,它包含扩展功能,但取决于 libA提供的基本功能。

例如:

在libA中:

void foo {...}

在libB中:

void bar { foo(); ... }

现在foo()的源代码同时存在于libA和libB中。如果同时存在一个与libA和libB的可执行文件链接,并且它同时调用foo()bar(),则可执行文件中将有foo()的源代码的两个副本。同样,这两个库之间也会有许多类似的情况。因此,最终可执行文件的大小不必要地超出了需要。

是否有一种方法可以使foo()的实现仅存在于libA中,而不能存在于libB中?有点像前向声明,在构建libB时,我只需要依赖声明,而无需链接实际实现?然后,可执行文件最终可以避免在其代码空间中复制foo()的副本。

为此,我找不到任何相关的LLVM指南,可能是我使用了不相关的关键字。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

除非完成某种内联或模板,否则foo的代码不应位于libB中;对于模板,当通过链接器的功能进行链接时,应对代码进行重复数据删除。您确定这确实在发生吗?

第1步正在检查您所优化的内容是否存在性能问题,如果没有,请不要在这里花费时间。

如果您实际上遇到性能问题,则编译器不应复制代码,除非它可以同时看到两个函数,在这种情况下,编译器将遵循其内联规则,除非您愿意,否则可能不希望对其进行调整专业的嵌入式开发人员或编译器工程师。内联规则非常复杂,将它们弄乱几乎总是错误的。