Swift 5.0.1 编译的模块无法被 Swift 5.1 编译器导入

Module compiled with Swift 5.0.1 cannot be imported by the Swift 5.1 compiler

我有一个 VoiceSampler.framework 是用 Xcode 10.3

构建的

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

Module compiled with Swift 5.0.1 cannot be imported by the Swift 5.1 compiler: /Users/apple/Projects/CaptureAppSwift/VoiceSampler.framework/Modules/VoiceSampler.swiftmodule/arm64.swiftmodule

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

此问题是由于您试图嵌入使用不同编译器版本创建的预编译框架造成的。

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

希望在未来的 Swift / 编译器版本中删除此限制... 有关详细信息,请参阅此处有关 "Module Stability" 的章节:https://swift.org/blog/abi-stability-and-more

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

在我的例子中,问题出在迦太基。因此,我在 Finder 中从项目的根文件夹中删除了这些文件:

Cartfile.resolved, Carthage/

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

但是如果你需要更新 carthage,那么你不需要删除文件。只有写命令 carthage update --platform iOS 解决这个问题。

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

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

有人建议 here

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

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

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

这最终会出现在您的 project.pbxproj 文件中:

BUILD_LIBRARY_FOR_DISTRIBUTION = YES;

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

以下命令解决了编译器错误

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

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