【问题标题】:Module compiled with Swift 5.0.1 cannot be imported by the Swift 5.1 compilerSwift 5.1 编译器无法导入使用 Swift 5.0.1 编译的模块
【发布时间】:2020-01-27 12:20:53
【问题描述】:

我有一个使用 Xcode 10.3 构建的 VoiceSampler.framework

我正在尝试在新项目中使用 Xcode11 中的该框架。我已经成功添加了该框架,但是当我在 AppDelegate 中写入 import VoiceSample 时,我收到以下错误:

Swift 5.1 编译器无法导入使用 Swift 5.0.1 编译的模块:/Users/apple/Projects/CaptureAppSwift/VoiceSampler.framework/Modules/VoiceSampler.swiftmodule/arm64.swiftmodule

我可以在 Xcode 11 中调整构建设置以使其正常工作吗? 还有其他解决方法吗?

【问题讨论】:

  • 什么是 VoiceSampler.framework?如果是迦太基,那么您必须更新迦太基。
  • VoiceSample.framework 是另一个开发人员提供的用于 MP3 音高/频率采样的库。我在 Xcode 10.3 中的项目中一直使用这个库,没有任何问题。什么是迦太基?以及如何/在哪里更新迦太基?
  • 问题在于 Xcode,因为 xcode 11 支持 swift 5.1,并且您的框架是用 swift 5.0.1 编写的,以解决此问题,或者将您的 Xcode 版本降级到 10.3 或获取最新版本的 VoiceSample。框架。

标签: ios swift xcode11


【解决方案1】:

此问题是由于您尝试嵌入使用不同编译器版本创建的预编译框架而引起的。

目前,预编译框架只有在编译器版本匹配的情况下才能嵌入! 用于编译项目的 swift 编译器版本必须与用于编译框架的版本相同。

希望在未来的 Swift / 编译器版本中可以移除这个限制... 有关更多信息,请参阅此处的“模块稳定性”一章:https://swift.org/blog/abi-stability-and-more

正如其中一个 cmets 中已经提到的,解决此问题的方法是升级或降级到适当的 Xcode 版本。 (或者,如果可能,使用所需的编译器版本重新编译框架,然后为您的项目使用相同的编译器版本。)

【讨论】:

  • 我已经在 5.1 中重新编译了 SDK 并上传了它,但是当我通过 cocoapods 安装 SDK 时,它又回到了 5.0.1。有什么办法可以解决这个问题吗?
  • 从 2020 年 4 月起,如果您将 Xcode 降级,则不会提交应用。如果您将YES 设置为Build libraries for distribution,那么它会给您带来大量其他错误。那么有什么解决方案吗?
【解决方案2】:

我遇到了 Sqlite.swift 的类似问题。执行以下命令对我有用:

carthage update --platform iOS --no-use-binaries

这是建议here

【讨论】:

  • 一切都由迦太基运送的假设是无效的。不幸的是,一些提供商通过邮件或网页上的胖二进制下载来提供他们的框架。
【解决方案3】:

只需在框架的构建设置中将Build Libraries for Distribution选项设置为Yes

【讨论】:

  • 在我打开Build Libraries for Distribution 开关后,它给了我另一种类型的错误<unknown>:0: error: using bridging headers with module interfaces is unsupported
  • @zionpi 你有解决办法吗?我也面临同样的情况
  • @AnkitGoyal 这是我的两分钱。如果您的项目引用了导致此类问题的third party library,那么请third party library 提供者给您正确的版本,或者降级您的XCode 版本匹配third party library's swift 版本。
【解决方案4】:

正如我已经描述的here,VoiceSample 的提供者应该用BUILD_LIBRARY_FOR_DISTRIBUTION = YES; 重建框架。在这种情况下,您将能够在所有 Swift 版本中使用 VoiceSample。

【讨论】:

    【解决方案5】:

    以下命令解决了编译错误

    1. carthage bootstrap --platform ios
    2. brew bundle
    3. pod repo update

    【讨论】:

    • 这应该是公认的答案。公认的答案给出了粗略的概括,而不是精确的解决方案。
    【解决方案6】:

    如果您使用 React Native 来构建您的应用程序,请转到 Xcode 并单击 File->Workspace Settings...-> 如果您发现有一个小箭头是 DerivedData 文件夹的路径,请单击该文件夹和实际文件夹将与其他 iOS 相关文件夹一起出现,删除 DerivedData 文件夹并重建您的应用程序。现在一切都会顺利进行...稍后谢谢我

    【讨论】:

      【解决方案7】:

      在我的情况下,问题将在迦太基。因此,我在 Finder 中从您项目的根文件夹中删除了这些文件:

      Cartfile.resolved, 迦太基/

      然后开始carthage bootstrap --platform iOS(因为我不需要更新carthage)。

      但如果您需要更新 carthage,则无需删除文件。只写命令carthage update --platform iOS修复这个问题。

      【讨论】:

        【解决方案8】:

        您需要在框架的构建设置中将 Build Libraries for Distribution 选项设置为 Yes,否则 swift 编译器不会生成必要的 .swiftinterface 文件,这些文件是未来编译器能够实现的关键加载您的旧库。

        这最终在您的 project.pbxproj 文件中为:

        BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
        

        设置此标志后,我使用 Xcode 11.0 (swift 5.1) 编译的框架能够使用 Xcode 11.2 (swift 5.1.2) 编译,并且一切似乎都正常工作。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 2020-03-04
        • 2020-03-01
        • 2020-02-27
        • 2022-01-07
        • 2020-03-17
        相关资源
        最近更新 更多