5

我正在开发一个相当复杂的 iOS 应用程序。为了使开发合理化,我已经开始将每个模块开发为一个独立的项目,然后在顶级应用程序项目中组合在一起,从而产生一个依赖树。

我以前成功地采用了这种方法,但是这次有一个共享依赖项(C),这会导致问题:

     A
    /|\
   / | \
  B  C  D
 / \     \
C   E     C

其中 A 是顶级应用程序项目,C 是功能的“核心库”。此核心库是 A 本身以及模块 B 和 D的依赖项。由此产生的多重编译会导致构建文件夹中出现重复符号并导致链接失败。

现在,我可以务实一点,只需从 A 中删除引用,因为无论如何这将由 B 编译到构建文件夹中,如果 D 不参与,这将起作用。但是我该如何解决 B 和 D 中 C 依赖的重复呢? B 和 D 项目在我独立编译时仍然需要对 C 的引用,但是在 A 的上下文中编译两次时会发生冲突。

我可以想象一些使用 objcopy 并为它们提供唯一前缀的复杂解决方案,但这会有点低效,因为它是相同的代码。我可以忍受这个,但有更好的方法吗?也许一些编译器或链接器标志可以重用构建文件夹中的现有符号(如果存在),而不是再次编译?

感谢您的任何建议。

4

1 回答 1

0

最适合我的解决方案是在每个模块项目中有两个目标:<TargetName>和一个我称为<TargetName>-NoLink的目标。

这两个目标是相同的,只是在-NoLink中省略了链接阶段。结果,只创建了中间.o文件,并且构建可以一直进行到项目,最终链接到所有模块。

链接的目标<TargetName>仍然存在,保留了在树中的任何点链接所有依赖项的灵活性,从而为任何模块生成独立的.a文件。

于 2015-10-04T12:37:25.193 回答