我正在开发一个相当复杂的iOS应用程序。为了使开发合理化,我已经开始将每个模块开发为一个独立的项目,然后在顶层的Application项目中一起组合,产生一个依赖树。
之前我已成功采用此方法,但这次有共享依赖项(C)导致问题:
A
/|\
/ | \
B C D
/ \ \
C E C
其中A是顶级应用程序项目,C是函数的“核心库”。此核心库是A本身以及模块B和D的依赖关系。由此产生的多重编译会导致构建文件夹中的重复符号并导致链接失败。
现在,我可以务实并且只是从A中删除引用,因为这将被B编译到构建文件夹中,如果不涉及D,这将起作用。但是我如何解决B和D中C依赖的重复? 当我单独编译它们时,B和D项目仍然需要对C的引用,但是在A的上下文中编译两次时会发生冲突。
我可以想象一些使用objcopy并给它们唯一前缀的复杂解决方案,但这会有点低效,因为它是相同的代码。我可以忍受这个,但有更好的方法吗?也许某些编译器或链接器标志重用构建文件夹中的现有符号(如果存在),而不是再次编译?
感谢您的任何建议。
答案 0 :(得分:0)
最适合我的解决方案是在每个模块项目中有两个目标:< TargetName> ,还有一个我称为< TargetName> -NoLink 的目标。
这两个目标是相同的,只是在 -NoLink 中省略了链接阶段。因此,只创建了中间的 .o 文件,并且构建可以一直进行到根项目,最终 链接到所有模块。
链接目标< TargetName> 仍然存在,保留了在树中任何位置链接所有依赖项的灵活性,从而为任何模块生成独立的 .a 文件。