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



从我的项目开始,我需要构建两个iOS静态框架:

  • 提供基本功能的libA,
  • 包含扩展功能但依赖于 libA 提供的基本功能。

如:

在libA中:

void foo {...}

在 libB 中:

void bar { foo(); ... }

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

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

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

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

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

如果你实际上在那里遇到性能问题,编译器不应该复制代码,除非它对这两个函数都有可见性,在这种情况下,它遵循它的内联规则,除非你是专业的嵌入式开发人员或编译器工程师,否则你可能不想调整。内联规则非常复杂,弄乱它们几乎总是错误的。

最新更新