如何管理包含重复依赖项的依赖树?(XCode,iOS)

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并给它们唯一的前缀,但这样效率会有点低,因为这是相同的代码。我可以接受这种方法,但是否有更好的方法呢?也许有一些编译器或链接器标志,可以重用构建文件夹中已经存在的符号,而不是再次编译?

感谢任何建议。


从技术上讲,这其实是同一个问题: https://dev59.com/TGbWa4cB1Zd3GeqPa9nx ...但它还没有得到充分的解答。 - Chris Hatton
我看不出问题所在。静态库在构建时不会链接其他库,但会暴露依赖项,这些依赖项只有在该库与可执行文件链接时才会解决。在你的情况下,“A”。看起来B、C、D、E都不是静态库,否则你的问题就没有意义了。 - Till
@Till:“静态库在构建时不会链接其他库”。是的,它确实会链接其他库,这正是问题所在!无论如何,我已经通过显式省略顶层以下目标的链接阶段来解决了这个问题,这样就可以得到您所描述的行为。 - Chris Hatton
是的,我知道有时候会这样做,从而产生所谓的“便利库” - 但这并不常见,正如你所说,通常是可以避免的。 - Till
1个回答

0

对我来说最好的解决方案是在每个模块项目中有两个目标:<TargetName> 和一个我称之为 <TargetName>-NoLink

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

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


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