【问题标题】:iOS Cocoa Frameworks multiple dependencies in workspaceiOS Cocoa Frameworks 工作区中的多个依赖项
【发布时间】:2016-02-23 18:27:31
【问题描述】:

我有一个具有以下层次结构的工作区

* App Project (uses Framework A & Framework B)
* 'Cocoa Framework A' Project
     - contains 'sub-framework B'

“应用程序项目”和“框架 A”都使用子框架 B。 当我将子框架 B 添加到“框架 A”链接框架时,它可以正常编译,但在编译“应用项目”时出现链接器错误(它找不到子框架 B 符号)。

但是,当我将“子框架 B”添加到“应用程序项目”中的链接框架时,一切都可以正常编译,但是当应用程序完成启动时,我在控制台中看到警告:

objc[53023]:AWSS3PutBucketLifecycleConfigurationRequest 类是 在两者中实施 [path-to-Derived-Data]/FrameworkA.framework/FrameworkA 和 [path-to-simulator-bundle]/App.app/Aoo.

将使用两者之一。哪一个是未定义的。

我正在失去理智,因为我找不到任何解决方案。 显然,我需要在编译结束时只链接一次“子框架 B”。 你能给我一些提示如何解决这个问题吗?

我附上了描述问题的示例项目: https://dl.dropboxusercontent.com/u/24532134/Example.zip

只需编译它并在控制台中查看警告。

【问题讨论】:

    标签: ios xcode cocoa-touch dependencies ios-frameworks


    【解决方案1】:

    您收到的警告并不是什么大问题 - 只要您确定 FrameworkA 和应用程序都使用相同版本的子框架,就不会出现问题。但是,作为一名优秀的开发人员,您应该担心此类警告。

    我可以向您建议 - 从应用程序中删除 FrameworkB 依赖项并将其伞头包含到 FrameworkA 的伞头中。这样,每当您链接 FrameworkA 时,您都会自动链接 FrameworkB,并且您可以通过包含 FrameworkA 伞头文件来访问它的功能声明

    这是您的示例,设置方式与我描述的方式相同

    Example project

    【讨论】:

    • 感谢 Sergii 的回复。您的示例项目按预期工作,但它有一个主要问题。假设“FrameworkB”有 ClassA 和 ClassB。 “FrameworkA”使用“ClassA”,“App”使用“ClassB”。在这种情况下,我收到链接器错误,因为“ClassB”没有与 FrameworkA 链接,因为它从未在那里使用过。显然,导入标头不会链接所有符号。
    • 我已将“-all_load”链接器标志添加到 FrameworkA,现在它可以工作了。但我怀疑这是否是正确的方法。它会显着增加构建大小,不是吗?
    • 问题是,如果您不将 ClassB 包含到 FrameworkB 总括标头中 - 这意味着,它仅对 FrameworkB 使用是私有的。如果您将它包含在伞头中 - 无论您是否需要它,您都将它包含在所有地方。就像 UIKit 一样——你总是写 ,即使你只需要它的 UIColor。对于第二个问题 - 是的, -all_load 会增加大小。显着与否 - 这取决于
    • 我确实在 FrameworkB 伞形标题中导入 ClassB。但是,ClassB 未链接,因为它从未在 FrameworkB 的任何“* .m”文件中使用过:
    • 抱歉,错过了。嗯,是的,您需要使用 -ObjC 链接器标志构建您的 FrameworkA。
    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2016-04-15
    相关资源
    最近更新 更多