【问题标题】:Embedding XCFramework in application with project framework dependencies将 XCFramework 嵌入到具有项目框架依赖项的应用程序中
【发布时间】:2020-05-21 12:32:15
【问题描述】:

我有一个 Xcode 工作区,其中包含一个具有 iOS 应用程序目标的项目和另一个具有框架目标的项目。框架目标依赖于另一个框架,以xcframework的形式集成:

  • 我的应用程序
  • 我的框架
  • 其他框架

使用常规的OtherFramework.framework 需要将其链接到MyFramework,然后嵌入到MyApp,即使MyApp 本身不需要框架。但是,当与xcframework 集成时,此项目将无法构建并出现No such module 'OtherFramework' 错误。

项目设置:

MyFramework Project

MyApp Project

MyApp 目标中删除OtherFramework.xcframework 可修复构建问题,但随后会导致library not loaded 错误,因为应用程序中不存在框架。

这里的演示项目:https://github.com/msaps/XCFramework-Link-Issue

您打算如何在应用程序中链接 xcframework 并在依赖框架中链接?

为什么?

pyckamil 刚刚发布了这篇文章,详细解释了这个问题:Everything wrong with XCFrameworks

Xcode 对ProcessXCFrameworkLibrary 步骤进行了优化,从.xcframework 中提取正确的.framework 用于活动构建架构。这仅运行一次,这会导致尝试链接同一框架的其他目标出现问题。

更新

此问题已在 Xcode 12.0 中解决

【问题讨论】:

  • 如果我构建了一个包含其他 cocoapods 的 swift 框架怎么办? .我确实检查了您的 github 存储库,我可以看到您的 OtherFramework.xcframework 是外部框架,其中包含 arm64 和 x86_64 文件。就我而言,当我进行 pod install 时,这三个依赖项不包含设备支持?这是 xcode 自己做的吗?或者我需要为设备和 sim 手动构建我的依赖项并将它们复制到我的 swift 项目中以进行构建? .你能分享一个包含 cocopods 的示例项目吗?

标签: ios swift xcode catalyst xcframework


【解决方案1】:

我也遇到过这样的问题。 首先,确保您的 MyFramework.framework 文件与 MyApp 位于同一目录中。

其次,在构建 MyFramework.framework 时,请确保 OtherFramework.xcframework 也在 MyFramework 的项目目录中。

还有一件事,检查目标 SDK 版本。它们应该在同一层的某个地方。

【讨论】:

  • MyFramework 框架是工作区中的一个项目 - 它们都具有相同的 $(SRCROOT) 并且框架搜索路径设置正确。 OtherFramework.xcframework 仅在其中一个项目中链接时可以毫无问题地找到,但如果我在两个项目中都链接它(并嵌入MyApp),按照正确包含框架的要求,会发生构建错误。
【解决方案2】:

检查构建设置并将框架搜索路径定义到包含相关框架的文件夹。如果框架放置在您的项目目录中,只需将框架搜索路径设置为 $(SRCROOT) 并将其设置为递归即可。

查看回复Getting error "No such module" using Xcode, but the framework is there

【讨论】:

  • 搜索路径设置正确 - 两个项目都可以单独找到xcframework 而不会出现问题。尝试在工作区中链接它们时会发生构建错误,这是确保框架正确嵌入和链接所必需的。
【解决方案3】:

在使用 xcframework 而不是 framework 后,我也遇到了这个问题。所以我改变了我的项目结构:

MyFramework Peoject 嵌入OtherFramework.xcframework,然后在MyFramework Project 中使用@_exported import OtherFramework 使其导出。而MyApp 只是链接MyFramework,但可以同时导入/使用MyFrameworkOtherFramework

顺便说一句,似乎自定义了@rpath 并手动设计了OtherFramework

【讨论】:

    【解决方案4】:

    我和你有同样的问题,看到你的 pbxproj 后我认为可以用同样的方法解决。

    将您的框架搜索路径更改为递归(通过 UI 或手动编辑 pbxproj "$(SRCROOT)/../Frameworks" => "$(SRCROOT)/../Frameworks/**"),如下所示:https://github.com/msaps/XCFramework-Link-Issue/pull/1/files

    【讨论】:

    • 您在答案中包含的链接可能指向有用的信息,如果确实如此,您应该在您的答案中包含此信息,并且不要发布仅链接的答案。如果将来链接断开,您的答案将毫无价值。
    • @Mustafa 该链接指向已经在整个答案中的单行更改的 PR。
    • @dipidoo 已对此进行了检查 - 它可能可以解决某些项目中的问题。但它也可能导致尝试从 XCFramework 链接不正确的架构的问题。我已更新 README 以反映此信息。
    【解决方案5】:

    IMO,似乎不是 xcframework 问题。

    看看这个答案:https://stackoverflow.com/a/59435627/2661407

    iOS、watchOS 或 tvOS 不支持 Umbrella 框架。

    OtherFramework.xcframework 应签名并嵌入到您的主机应用程序中。

    并将“@executable_path/Frameworks”设置添加到您的 MyFramework.framework > Build settings > Runpath Search Paths。

    【讨论】:

    • 这里的框架都不是伞形框架,当尝试将OtherFramework.xcframework 嵌入到宿主应用程序中,同时它也链接到宿主应用程序使用的另一个框架中时,就会出现问题。
    • 你是对的。这不是一个总括框架问题。我也遇到了同样的问题。然后我建议一个解决方法。 github.com/msaps/XCFramework-Link-Issue/pull/2
    【解决方案6】:

    更新 - 在 Xcode 12.0 中解决

    shinsuk 提出了一种可靠的解决方法,该解决方法通过添加架构明确的框架搜索路径来确保在 XCFramework 中找到正确的.framework

    详情请见README

    【讨论】:

    • 你能分享一个github链接到你上面描述的解决方案吗?
    • 这个问题仍然存在于 xcode12.4 中,对吧?我有同样的问题,必须走这条路来解决它
    • 是的@MartinMlostek 我也有它,这确实是修复。具有讽刺意味的是,XCode 似乎不能很好地与 xcframeworks 一起工作。
    猜你喜欢
    • 2020-11-02
    • 2021-02-15
    • 2012-11-27
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多