1

我创建了两个 iOS .frameworks

他们都完美编译

我的结构如下:

iPadProject
  - framework1
     - framework2

所以Framework2包含在framework1中,framework1包含在实际的iPad项目中

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

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

4

2 回答 2

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 链接到 f2 时将-all_load传递给链接器!

于 2013-01-07T16:38:02.563 回答
1

不要嵌套静态库,包括 iOS 框架。如您所见,它会导致重大问题(当两个框架都有自己的第三个框架时,它会导致更多问题)。最后的链接步骤应该链接所有需要的库;静态库不应该链接其他静态库。没有真正好的方法可以自动执行此操作。它只是框架文档的一部分。

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

于 2013-01-07T14:21:59.047 回答