2013-05-28 184 views
5

我正在开发一个相当复杂的iOS应用程序。为了使开发合理化,我已经开始将每个模块作为独立项目进行开发,然后将它们组合在顶级应用程序项目中,从而生成依赖关系树。如何管理包含重复依赖关系的依赖关系树? (XCode,iOS)

我成功之前,已经采取了这种做法,但这次有一个共同的依赖(C),这将导致一个问题:

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

其中A为顶级应用程序项目,C是“核心库“的功能。此核心库是A本身以及模块B和D的依赖关系。生成的多重复合会导致生成文件夹中出现重复的符号,并导致连接失败。

现在,我可以很实用,只需从A中删除引用,因为无论如何都会将它们编译到构建文件夹中,并且如果D没有涉及,那么这只会起作用。但是我该如何解决从B和D解决C依赖关系的重复问题? 的B和d项目仍然需要与C的参考,当我编译它们独立位置,但是当A的情况下编了两次

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

感谢您的任何建议。

+0

从技术上说,这是因为同样的问题: http://stackoverflow.com/questions/11784917/how-do-i-resolve-avoid-duplicate-symbols-in-common-transitive-xcode-dependencies 。 ..但它没有得到充分的答复。 –

+0

我不能看到这个问题,一个静态库在构建时不会链接到其他库,但公开了只有当该库链接到可执行文件时才解析的依赖关系。在你的情况下“A”。看来B,C,D,E不是静态库,否则你的问题就没有意义了。 – Till

+0

@Till:“一个静态库,在构建时不会链接到其他库”。是的,确实如此,这就是问题所在!无论如何,我已经明确地忽略了顶层以下目标的链接阶段,从而解决了这个问题,然后导致你描述的行为。 –

回答

0

是工作最适合我的解决方案是具有每个模块项目中的两个目标:<的TargetName >和一个我叫<的TargetName > -NoLink

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

链接的目标<的TargetName >遗体,保持灵活性,所有依赖于树中的任何链接点,产生一个独立的.A文件的任何模块。