iOS项目的预链接静态库

8
我有一个大型iOS项目,由20-30个静态库组成,这些库链接在一起形成最终的可执行文件。其中一些组件是平台无关的(纯C ++),而另一些组件是iOS特定的(Obj-C / Obj-C ++)。C ++模板被广泛使用,因此每个对象文件包含许多具有模糊连接的符号。问题在于,这些符号仅在链接最终可执行文件时合并,而不是在制作静态库时合并。每个库都包含大量重复的符号(6-60个克隆)。因此,应用程序的最终链接需要几分钟时间。在调试和进行一些小更改时,这变得非常烦人。
有没有一种方法可以为每个库执行模糊连接符号的合并?
我知道,在使用动态库时,这是自动完成的。通过一些黑客技巧(http://sumgroup.wikispaces.com/iPhone_Dynamic_Library),可以为iOS构建动态库。有没有一种方法将dylib静态链接(将它们链接到单个可执行文件中)?
当然,能够调试生成的应用程序是必须的。

https://dev59.com/-HA75IYBdhLWcg3weY5f - godspeed1024
1个回答

15
您可以预链接您的静态库对象到一个单一的对象中,也可以将其他静态库预链接成一个单一的对象。它实际上会使用链接器(几乎像在动态库中一样)来链接对象。
  1. 在您的单个库(主要的)中,进入构建设置,并找到链接部分中的 执行单个对象预连接。将其切换为Yes。
  2. 在预链接库中,您可以指定要包含的其他库。这里不仅需要放入名称,还需要完整的文件名。如果其他库也来自于您的项目,则可以使用 $(CONFIGURATION_BUILD_DIR) 变量。因此,如果您有库foo,则应该是 $(CONFIGURATION_BUILD_DIR)/libfoo.a
  3. 您可以添加单个对象预链接标志。
  4. 如果您想剥离本地符号,请确保已将部署后处理设置为Yes,因为默认情况下静态库不会被剥离。

3
静态库的一个好处是它可以包含许多模块,除非需要解决未定义引用,否则这些模块永远不会链接到最终应用程序中。预链接会削弱这个好处,对吗? - Kevin Hopps
2
我和上面的Kevin Hopps有同样的问题。我认为这将使您无法在使用.a文件链接最终二进制文件时省略模块。 - Chris Quenelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接