Swift 5.1 编译的模块不能被 Swift 5.1.2 编译器导入

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

我有一个框架(在本例中是 RxSwift),我使用 Xcode 11.0 将其编译到传统的 RxSwift.framework 样式包中

这很好地导入了 Xcode 11.0,而且 11.1 从来没有任何问题

今天,Apple 发布 Xcode 11.2,我升级了,出现错误:

使用 Swift 5.1 编译的模块无法被 Swift 5.1.2 编译器导入

我习惯了 swift 编译器不匹配,我知道我可以使用 Xcode 11.2 重新编译 RxSwift 并继续,但是 [= =38=] 5.1 模块稳定性.

我的印象是,既然我们有了模块稳定性,框架就不需要在每个新 Xcode 版本中不断重新编译,但显然情况并非如此。

如果有人能解释这里发生了什么,我将不胜感激。 Xcode 11.2 是否出现错误?或者当我最初使用 Xcode 11.0 编译时,我是否需要以某种方式告诉它我想要模块稳定性?

好的,如果你看了 WWDC 视频,他们会解释说: https://developer.apple.com/videos/play/wwdc2019/416/

您需要在框架的构建设置中将 Build Settings > Build Options > 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 使用) 一切似乎都正常工作。

希望这个question/answer能为所有没有看过所有WWDC视频的人提供有用的参考

如果错误仍然存​​在,请转到 产品 > 清理构建文件夹 并再次 构建 .

我在导入第 3 方库时遇到了同样的错误。 我使用 Xcode 中的工具链修复了它,并从这里 https://swift.org/download/#releases 获取了 2019 年 9 月 19 日的版本。 之后我不得不重新导入我的库并且它起作用了。

您可以使用Carthage 添加RxSwift 框架。

基本上,迦太基给你一个类似传统RxSwift.framework风格的包

然后尝试carthage update --no-use-binaries

这使我的编译器错误消失了。

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

我 运行 遇到了同样的问题,我只切换了 b运行ches。我删除了几次派生数据+清理构建。直到我重新启动它才起作用 Xcode

闭源的模块稳定性和库进化支持

[ABI]

Swift v5.0 引入了稳定的 ABI

Swift v5.1 发布 Module stabilityLibrary evolution support 适用于 闭源(二进制)框架(库)(框架单独构建来自消费者)

检查Swift版本:

Swift Language Version(SWIFT_VERSION)

要启用它,您应该使用 v11 中的 Xcode:

构建分发库 (BUILD_LIBRARY_FOR_DISTRIBUTION)

Select framework target -> Build Settings -> Build Libraries for Distribution (BUILD_LIBRARY_FOR_DISTRIBUTION) -> Yes

swiftc 标志:

-enable-library-evolution
-emit-module-interface

此设置生成 .swiftinterface

Swift 模块接口 (.swiftinterface)

Swift Module 使用与 Objective-C 模块使用相同的方法 - precompiled binaryCompiled Module.

Swift Module Interfaces 是模块 public API 的文本表示。它是 Swift 对 Objective-C 的 headers .h 文件的替代。

//previously
consumer(app) -> import Module -> producer(framework) .swiftmodule

//using .swiftinterface
consumer(app) -> import Module -> .swiftinterface -> producer(framework) .swiftmodule

尽管 .swiftmodule 这是可变的,你可以在哪里得到

Module compiled with _ cannot be imported by the _ compiler

.swiftinterface 是稳定的,当有变化时不需要更新(例如 Swift 版本)

没有攻击

它位于下一个文件夹中

<framework_name>.framework/Modules/<framework_name>.swiftmodule

看起来像:

// swift-interface-format-version: 1.0
// swift-compiler-version: Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53)
// swift-module-flags: -target x86_64-apple-ios12.2-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name UtilsSwiftFramework
import Foundation
import Swift
@_exported import UtilsSwiftFramework
@_inheritsConvenienceInitializers @objc public class GFISClassA : ObjectiveC.NSObject {
  @objc public static var shared: UtilsSwiftFramework.GFISClassA
  @objc public func GFISprintHelloWorld()
  @objc public func GFISprintHelloWorld(arg1: Swift.String, arg2: Swift.String)
  @objc deinit
  @objc override dynamic public init()
}

如您所见,它还包含:

swift-interface-format-version
swift-compiler-version
swift-module-flags

*如果你使用 dynamic 而不使用 @objc[About]

,你会得到下一个错误
Marking non-'@objc' Swift declaration 'dynamic' in library evolution mode is not supported

XCFramework[About] 强制你使用它

苹果建议闭源使用.swiftinterface,开源使用Swift Package Manager[About]

从 Xcode 12.3 回到 Xcode 11.3.1 后,我在 repo 上遇到了这个问题。我已经总结更新了我的命令行工具,需要将它们恢复到早期版本以建立我的依赖关系。

分发 (BUILD_LIBRARY_FOR_DISTRIBUTION) -> 是 & Pod 更新 - 错误消失了。

如果即使在尝试了上述所有步骤之后,问题仍未解决,请尝试查看您的存储库中是否存在与您的项目没有直接关系的所有预构建文件夹。删除所有这些,删除 pods 文件夹和 podfile.lock 并清理派生数据,然后尝试构建。

对我有用:D