我有一个框架(在本例中为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编译时需要某种方式告诉它我想要模块稳定性吗?
答案 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)
Swift v5.0
引入了稳定的ABI
Swift v5.1
交付了Module stability
和Library 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)
这使我的编译器错误消失了。
carthage bootstrap --platform ios
brew bundle
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 上遇到了这个问题。我已经简要地更新了我的命令行工具,需要将它们恢复到早期版本,以便构建我的依赖项。