【问题标题】:Module compiled with Swift 4.1.2 cannot be imported by the Swift 4.2 compilerSwift 4.2 编译器无法导入使用 Swift 4.1.2 编译的模块
【发布时间】:2019-02-24 01:48:57
【问题描述】:

简短的故事:Xcode 10 设置为 Swift 4,但它使用的是 Swift 4.2。

长话短说:我们的项目还没有为 Swift 4.2 做好准备,因为我们的依赖框架还不是 Swift 4.2。但是,我至少想使用 Xcode 10。

  • 我安装了 Xcode 9.4.1 和 Xcode 10。
  • 我已将命令行工具设置为使用 Xcode 9.4.1:

  • 在 Xcode 10 中,我将项目设置 Swift Language Version 设置为 斯威夫特 4。

  • 我已经在命令行上验证了 shell 的 Swift 版本 使用的是 4.1.2:

"swift --version Apple Swift 版本 4.1.2 (swiftlang-902.0.54 clang-902.0.39.2)"

  • 我已运行 carthage update。
  • 我已退出 Xcode 10 并重新启动。
  • 我已经深度清理并删除了派生数据。
  • 我构建并收到此错误:

"使用 Swift 4.1.2 编译的模块不能被 Swift 4.2 导入 编译器: .../App/Carthage/Build/iOS/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64.swiftmodule"

对我来说,这表明我正确设置了预期的 Swift 版本 (4.1.2),而 Xcode 仍在尝试使用错误版本的 Swift (4.2)。

有人对如何解决这个问题有建议吗?我错过了什么吗? Xcode 错误?

【问题讨论】:

    标签: ios xcode xcode10


    【解决方案1】:

    您可以使用多个 swift 工具链。安装某些版本后下载 url swift toolchain download。重启你的 xcode,在 xocde 菜单中你可以看到 toolchains 选项。

    【讨论】:

    • 我刚刚更新到 Xcode 10.2 和一个外部库不能在新的 SDK 上运行,我收到了同样的 Swift 5 构建错误。我下载了 swift 工具链。现在构建错误消失了,但是在设备/模拟器上运行它时会导致崩溃并出现错误“原因:库版本不兼容:Instamojo 需要版本 1.0.0 或更高版本,但 libswiftCore.dylib 提供版本 0.0.0”。有什么想法吗?
    • 您需要更新 Instamojo 版本或为您的项目构建 Instamojo 源代码。
    【解决方案2】:

    在 Xcode 10 中使用 Realm 需要从源代码构建它。在终端写:

    git clone --recursive https://github.com/realm/realm-cocoa.git
    
    cd realm-cocoa
    
    sh build.sh ios-swift
    

    【讨论】:

    • 感谢您的回复。我也可以使用“Carthage update --no-use-binaries”,但使用 Xcode 10 工具集,它使用 Swift 4.2。如何指定 Swift 4。这不是 Carthage 问题,而是 shell 环境问题。
    【解决方案3】:

    我不是很肯定,但我的猜测是这就是原因:

    我已将命令行工具设置为使用 Xcode 9.4.1

    您必须使用 Xcode 10 重新编译您的 Swift 4 依赖项,因为 Swift is not ABI-stable,即使用不同编译器版本编译的二进制文件不兼容。甚至使用不同版本的 Xcode 编译的 Swift 4.0 二进制文件也可能不兼容。

    我对 Carthage 没有太多经验,但我的猜测是你应该使用 Xcode 10 作为命令行工具,但你必须设置一个不同的 Swift 语言版本以供 Xcode 10 使用。它可能应该在项目中指定(在本例中为 RealmSwift),或使用环境变量,但恐怕您需要其他人来回答更多细节。

    【讨论】:

    • 这是有道理的。我认为“不能由 Swift 4.2 编译器导入”消息是一个红鲱鱼。最初,我尝试使用 Xcode 10 进行编译,但框架是使用 Swift 4.2 构建的,我找不到让命令行使用 Swift 4 的方法。
    • 我可以将我的命令行环境设置为使用 Xcode 10 工具集,但如何将其设置为使用 Swift 4 而不是 Swift 4.2?
    • @Heliotropix,通常在 Xcode 项目中使用SWIFT_VERSION 构建设置进行设置。如果我没记错的话,它也可以作为环境变量传递给 xcodebuild。从理论上讲,迦太基应该只是从项目中获取它。我不知道是否有任何方法可以强制它使用特定的 Swift 版本。如果你只是用 Xcode 10 工具链编译它会发生什么?它失败了吗?它会产生什么错误?在 RealmSwift 项目中(master 分支)看起来它实际上设置为使用 Swift 3 :)
    【解决方案4】:

    我遇到了同样的问题,然后我意识到我没有选择 Xcode 10 作为我的Xcode。试试:

    sudo xcode-select -s /Applications/Xcode10.app
    

    另外,如果您要在 Xcode9 和 10 之间切换,我建议您执行以下操作:如果您从 9 更改为 10,请运行 mv Carthage Carthage9 然后重建 Carthage。每当您想切换回来时,将 Carthage 移动到 Carthage10 并执行 mv Carthage9 Carthage。这将为您节省大量构建时间。

    【讨论】:

    • 并非我的所有框架现在都使用 Swift 4.2 构建。我的问题不是用 Xcode 10 构建它们。我可以做到。我想做的是用 Swift 4.1.2 构建它们,并在我的 pre-Swift 4.2 项目中使用它们。当我这样做时,Xcode 给我一个错误,说它们不能被 Swift 4.2 编译器导入。我该如何补救?
    • 从您的问题中引用:“但是,我想,至少,使用 Xcode 10。”。对我来说,这意味着你不能构建 Xcode 10。但是在这个评论中你说你可以?我建议你重新提出你的问题并更好地解释你的情况。
    猜你喜欢
    • 2019-03-15
    • 2019-02-23
    • 1970-01-01
    • 2020-01-27
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多