【问题标题】:pre-link static libraries for ios projectios项目的预链接静态库
【发布时间】:2012-12-24 22:16:13
【问题描述】:

我有一个大型 iOS 项目,它由几个(大约 20-30 个)静态库组成,这些静态库链接在一起形成最终的可执行文件。有些组件是平台无关的(纯 C++),有些是 iOS 特定的(Obj-C/Obj-C++)。 C++ 模板被大量使用,因此每个目标文件都包含大量链接模糊的符号。问题是这些符号仅在链接最终可执行文件期间合并,而不是在制作静态库时合并。每个库都包含大量重复的符号(6-60 个克隆)。因此,应用程序的最终链接需要几分钟时间。这在调试和做一些小改动时会变得非常烦人。

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

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

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

【问题讨论】:

标签: c++ ios templates linker static-libraries


【解决方案1】:

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

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

【讨论】:

  • 静态库的一个好处是它可以包含许多永远不会链接到最终应用程序的模块,除非它们需要解析未定义的引用。预链接会带走这种好处,对吧?
  • 我和上面的 Kevin Hopps 有同样的问题。我认为这消除了当您使用 .a 文件链接最终二进制文件时省略模块的能力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
相关资源
最近更新 更多