为ios项目预链接静态库

kja*_*jam 4 c++ linker templates static-libraries ios

我有一个很大的iOS项目,它包含几个(大约20-30个)静态库,它们链接在一起成为最终的可执行文件.一些组件是独立于平台的(纯C++),一些是特定于iOS的(Obj-C/Obj-C++).C++模板被密集使用,因此每个目标文件都包含许多带有模糊链接的符号.问题是这些符号仅在最终可执行文件的链接期间合并,但在创建静态库时不合并.每个库包含大量重复的符号(6-60个克隆).所以应用程序的最终链接需要几分钟.在调试和做一些小的改动时,这变得非常烦人.

有没有办法为每个库执行符号与模糊链接的合并?

我知道,这是在使用动态库时自动完成的.通过一些黑客攻击(http://sumgroup.wikispaces.com/iPhone_Dynamic_Library),可以为iOS构建动态库.有没有办法静态链接dylib(将它们链接到一个可执行文件)?

当然,能够调试生成的应用程序是必须的.

Dmi*_*try 11

您可以将静态库对象预先链接到单个对象,也可以将其他静态库预先链接到一个.它实际上会将对象与链接器链接起来(几乎就像在动态库中一样).

  1. 在您的单个库(主要库)中,转到"构建设置"并Perform Single-Object Prelink在"链接"部分中查找.将其切换为是
  2. 在Prelink库中,您可以指定要包含的其他库.在那里你不仅需要放名称,还需要完整的文件名.如果其他库也来自您的项目,那么您可以使用$(CONFIGURATION_BUILD_DIR)变量.所以,如果你有库foo,那么它就是$(CONFIGURATION_BUILD_DIR)/libfoo.a
  3. 您可以在单对象预链接标志中添加其他标志
  4. 如果要删除本地符号,请确保将"部署后处理"设置为"是",因为默认情况下不会删除静态库.

  • 静态库的好处之一是它可以包含许多永远不会链接到最终应用程序的模块,除非需要它们来解析未定义的引用。预链接会消除这种好处,对吗? (3认同)
  • 我和上面的凯文·霍普斯有同样的问题。我认为这消除了当您使用 .a 文件链接最终二进制文件时省略模块的能力。 (2认同)