繁体   English   中英

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样式 package

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

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

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

我习惯了 swift 编译器不匹配,我知道我可以使用 Xcode 11.2 重新编译 RxSwift 并继续,但 Swift 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) 使用,并且一切似乎都正常工作。

希望这个问题/答案能为所有没有看过所有 WWDC 视频的人提供有用的参考

如果错误仍然存在 go 到Product > Clean Build Folder并再次构建。

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

[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是模块公共 API 的文本表示。 它是 Swift 的 Objective-C 头文件.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

*如果你在没有@objc情况下使用dynamic ,你会得到下一个错误[关于]

Marking non-'@objc' Swift declaration 'dynamic' in library evolution mode is not supported

XCFramework [About]强制你使用它

Apple 建议将.swiftinterface用于封闭源代码, Swift Package Manager [About]用于开源

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

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

Distribution (BUILD_LIBRARY_FOR_DISTRIBUTION) -> Yes & Pod update - 这个错误对我来说消失了。

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

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

从 Xcode 12.3 移回 Xcode 11.3.1 后,我在回购中遇到了这种情况。 我已经快速更新了我的命令行工具,并且需要将它们恢复到早期版本才能建立我的依赖关系。

通过从项目的根文件夹运行命令修复了错误:

carthage update --use-xcframeworks --platform iOS --cache-builds

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

它对我有用:D

我设法解决此问题的另一种方法是仔细检查您正在使用的模块并查看它是否有更新。 我在我的项目中使用 ViewControllerPresentationSpy 来测试警报控制器。 我做了一个 pod reintegrate,然后 pod install,将版本从 5.1 更新到 6.0,因为该模块的作者已经发布了更新。 我在我的项目中删除了上一个模块的文件夹。 然后对于新版本,我能够在清理构建并进入项目导航器并将其添加到项目的 VC Presentation Spy 的复制文件部分后,将项目拖放到所有测试的上方。

长话短说,仔细检查您从哪里获得模块并检查更新并将其再次添加到您的 Xcode 项目中。

有时可以帮助在 Apple M1 上运行应用程序

通过添加它进行调试来更改构建设置

也可以在终端尝试:

arch -x86_64 pod install

我从 xcode 13.4 移动到 xcode 14.1 后遇到了类似的问题解决方案是在 Xcode - 首选项 - 命令行工具中设置适当的编译器

我遇到了同样的问题,我只切换了分支。 我删除了派生数据+清理构建几次。 在我重新启动 Xcode 之前它没有工作

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

基本上,Carthage 为您提供了类似的传统 RxSwift.framework 样式 package

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM