【问题标题】:Module compiled with Swift 4.2.1 cannot be imported by the Swift 5.0 compilerSwift 5.0 编译器无法导入使用 Swift 4.2.1 编译的模块
【发布时间】:2019-08-17 15:41:22
【问题描述】:

我正在尝试按照https://github.com/Paytm-Payments/Paytm_iOS_App_Kit/tree/master/Swift/BitCodeDisabled/PaytmNativeSDK 的指示将第三方应用程序集成到项目中

我在构建中看到以下错误

使用 Swift 4.2.1 编译的模块不能被 Swift 5.0 导入 编译器

我已经尝试过工具链https://medium.com/xcblog/switching-swift-versions-inside-xcode-using-toolchains-755b28831c43 错误更改为原因:库版本不兼容:PaytmNativeSDK 需要版本 1.0.0 或更高版本,但 libswiftCore.dylib 提供版本 0.0.0

我如何设置 XCode 或库以使其工作。供应商不可能为 Swift 5.0 更新库并使其在 POD 上可用。

【问题讨论】:

  • 你不能。您只有编译后的代码。您需要源代码才能将其更改为 Swift 5。您需要在项目的其余部分使用 Swift 4.2。
  • 我在哪里可以强制 XCode 不使用 Swift 5,在 podfile 中我设置了 4.2 并且在 XCode Swift 语言版本设置为 4.2,但我看到了错误。
  • 我不想revert来revert Xcode,为什么不能只更改项目中的swift版本?
  • @SSR 你找到解决办法了吗
  • 我也有同样的问题。为什么当我们要求 Xcode 在 Xcode 的 Build Settings 的 Swift 语言版本中使用 Swift 4.2 时它没有并保持错误?

标签: ios swift paytm


【解决方案1】:

对于 Carthage 用户:升级到 Xcode 10.2 后,我在使用 Carthage 导入的框架中遇到了同样的问题。

我通过重建框架解决了这个问题:

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

【讨论】:

【解决方案2】:

正确的解决方案是下载 Xcode 10.1,然后等待 Apple 补丁修复错误。

不要浪费时间修复第三方错误。


我的项目的问题是我们使用的是 Carthage 无法更新的 Alamofire。

【讨论】:

  • 如果您使用的是 swift 4 并且仍然有 xcode10.1,则此答案更正确。如果您的项目在 swift 4 中,那么您真的没有充分的理由必须在 swift 5 中重建依赖项。
  • 这被认为是一个错误吗?是否已向 Apple 报告? Swift 5.0 编译器是否应该能够导入 4.2.1 编译的框架?
  • 我错了吗:如果您使用 Xcode 10.1,您将无法与 iOS 12.2 兼容,不是吗?
【解决方案3】:

这个库的提供者应该使用BUILD_LIBRARY_FOR_DISTRIBUTION = YES; 重建它(在Xcode 11.3 中的Build Settings -> Build Options 中可用)。已经要求这样做in the corresponding GitHub issue。之后,PaytmNativeSDK 将与下一个 Swift 版本兼容。

看起来问题已在804152caae76245d96548eb74ea87a6150239407 中得到解决。

【讨论】:

    【解决方案4】:

    我想使用 Swift 4.2(Xcode 10.2 应该仍然支持,我已经在 Swift 语言版本中设置了它),但它仍然给我一个关于 Swift 5.0 编译器的错误。因此,在尝试清除构建文件夹、派生数据等所有内容后,我得出的结论是它不适用于 Xcode 10.2。

    我恢复到 Xcode 10.1,你可以下载 here。这行得通。因此,在 Apple 修复此错误之前,我不得不继续使用 Xcode 10.1。

    【讨论】:

      【解决方案5】:

      框架的开发者需要提供一个更新,它是在 Xcode 10.2 中构建的。

      对框架开发者的解释:
      即使您在 Xcode 10.2 中或使用 CI 使用的默认版本创建框架,您的用户仍可能遇到此类错误。您应该确保 Xcode 10.2 是您的默认命令行工具。您可以使用命令xcodebuild -version 在终端中检查它。 默认版本可以在Xcode -> Preferences -> Locations -> Command Line Tools调整。

      【讨论】:

        【解决方案6】:

        如果您的项目中有仍然使用 4.2 编译器构建的外部库,而新的 Xcode 尝试在 5.0 编译器中构建您的项目,则会发生这种情况。

        就我而言,我使用 Carthage 导入的库很少。幸运的是,我使用的库在过去几天发布了更新,使其与 Swift 5.0 编译器兼容。如果那些外部库还没有更新它以支持 Swift 5.0,那么你现在可能不走运。

        在此过程中您可能仍会遇到一些问题,这里有一些最佳做法可以避免进一步的问题。

        1. 完全删除 cartfile.resolved 和 Carthage 文件夹
        2. 确保删除之前添加到项目中的所有库副本。
        3. 从您的 Targets> Yourapp > General 中删除嵌入式库和链接的框架和库。
        4. 产品 > 清理构建文件夹
        5. 使用 Carthage 更新命令更新购物车文件并获取新来源
        6. 现在将库导入回您的项目。

        希望它有效。

        【讨论】:

          【解决方案7】:

          我对 Carthage 的问题与复制二进制文件的 xcode 阶段有关 “carthage copy-frameworks”阶段。

          我的解决方案与https://stackoverflow.com/a/55362536/721929 中评论的解决方案略有不同,因为该解决方案在某些情况下还会更新依赖项版本。

          所以,我刚刚执行了“carthage build”。我还包括 Carthage 的缓存清理,以修复子任务中可能出现的错误(在我的情况下,git clone 失败并出现“退出代码 1”

          rm -rf ~/Library/Caches/org.carthage.CarthageKit
          carthage build --no-use-binaries --platform iOS --verbose
          

          【讨论】:

            【解决方案8】:

            只需删除所有 *.framework 文件夹,获取并生成,然后将新的框架文件夹导入您的项目。 这对我有帮助。

            例如:

            【讨论】:

              猜你喜欢
              • 2019-09-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-27
              • 2019-02-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多