使用Swift 5.1编译的模块不能由Swift 5.1.2编译器导入

时间:2019-11-01 05:57:20

标签: ios swift xcode swift5.1

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

这很好地将Xcode 11.0和11.1导入了它,没有问题

今天,在Apple发布Xcode 11.2之后,我进行了升级,并出现以下错误:

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

我曾经习惯于快速编译器不匹配,并且我知道我可以使用Xcode 11.2重新编译RxSwift并继续进行,但是Swift 5.1的标题功能是模块稳定性

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

如果有人可以解释这里发生的事情,我将不胜感激。 Xcode 11.2是否存在错误?还是我最初用Xcode 11.0编译时需要某种方式告诉它我想要模块稳定性吗?

8 个答案:

答案 0 :(得分:70)

好,原来,如果您观看WWDC视频,他们会解释: https://developer.apple.com/videos/play/wwdc2019/416/

您需要在框架的构建设置中将构建要分发的库选项设置为,否则,快速编译器不会生成必要的.swiftinterface这些文件是将来编译器能够加载您的旧库的关键。

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

BUILD_LIBRARY_FOR_DISTRIBUTION = YES;

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

希望此问题/答案将为所有未观看所有WWDC视频的人提供有用的参考

答案 1 :(得分:4)

[ABI]

Swift v5.0引入了稳定的ABI

Swift v5.1交付了Module stabilityLibrary evolution support,它们适用于封闭源框架(或库)(框架与使用者分开构建)

要启用它,您应该使用Xcode v11和

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

此设置在.swiftinterface中生成.framework/Modules/.swiftmodule。它是Objective-C的.h的Swift替代品。看起来像:

// 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()
}

*如果您使用Marking non-'@objc' Swift declaration 'dynamic' in library evolution mode is not supported而不使用dynamic [About]

,则可以获得@objc

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

我开始看到相同的问题,发现我使用了不正确的xcode命令行工具。转到“首选项”>“位置”,并将命令行工具从Xcode 11.1更改为11.2.1。为了安全起见,我还清除了派生数据目录并运行carthage build

答案 4 :(得分:1)

导入第3方库时出现相同的错误。 我使用Xcode中的工具链修复了该问题,并从此处https://swift.org/download/#releases获取了2019年9月19日的版本。 之后,我不得不重新导入我的库,然后它就起作用了。

答案 5 :(得分:-1)

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

基本上,迦太基为您提供了类似的 RxSwift.framework传统样式包

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

答案 6 :(得分:-1)

我遇到了只切换分支的同一问题。我删除了派生数据+清理生成几次。直到我重新启动Xcode,它才起作用

答案 7 :(得分:-1)

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