带有依赖关系的iOS框架

时间:2013-01-07 11:02:54

标签: objective-c ios frameworks dependencies

我创建了两个iOS .frameworks

他们都完美编译

我的结构如下:

iPadProject
  - framework1
     - framework2

所以Framework2包含在framework1中,而framework1包含在实际的iPad Project中

所以我的问题是,如果我将framework1和framework2都添加到我的iPadProject中,它将无法编译,因为它抱怨来自framework2的重复符号(这是合乎逻辑的,因为它已经包含在framework1中)

但是当我从frame1访问一个方法时,我只将framework1包含到我的iPadProject中,而该方法又从framework2访问一个方法,它会使用“signal SIGABRT”崩溃应用程序

2 个答案:

答案 0 :(得分:1)

不要嵌套静态库,包括iOS框架。正如您所见,它会导致重大问题(当两个框架各自拥有自己的第三个版本时,会导致更多问题)。最后的链接步骤应链接所需的所有库;静态库永远不应该链接其他静态库。没有真正好的方法来自动化这个;它只需要成为框架文档的一部分。

但是,由于未能链接框架,因此不应该获得运行时异常。您应该获得链接时失败,指示未定义符号。如果你遇到了崩溃,那表明你在链接中做了一些奇怪的事情。

答案 1 :(得分:1)

问题在于,因为它现在是嵌套的,所以链接器将f2链接到f1 - 仅仅是f1所需的f2部分。

f2有5个符号(f2_1 - 5)
f1使用f2_1和f2_2但不使用3,4,5 =>链接器抛弃它

现在应用程序需要f2_3,f2_4和f2_5,但它们不在那里......但是在编译时没人知道。


现在你尝试通过再次将应用程序与f2相关联来解决它,但是在编译时没有人,链接器优化了f2_3 - 5并且它们被假定为f1,因此是重复的!


解决这个Rob Napier的方法已经提到了。 不嵌套框架(主要不是静态框架/第三部分框架)

一种解决方法是当f1中的f1链接时将 -all_load 传递给链接器!