使用Swift 4.2编译器无法导入用Swift 4.1.2编译的模块。

16

简短描述: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:

enter image description here

  • Xcode 10 中,我已将项目设置中的 Swift 语言版本设置为 Swift 4。

enter image description here

  • 我已在命令行界面验证了使用的 Swift 版本是 4.1.2:

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

  • 我已运行 carthage update。
  • 我已退出 Xcode 10 并重新启动。
  • 我已经进行了深度清理并删除了 Derived Data。
  • 当我构建时,出现以下错误:

"Module compiled with Swift 4.1.2 cannot be imported by the Swift 4.2 compiler: .../App/Carthage/Build/iOS/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64.swiftmodule"

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

有人有解决方法吗?我是否遗漏了什么?是Xcode的bug吗?

4个回答

5
我不确定,但我的猜测是这个原因:
引用: 我已将命令行工具设置为使用Xcode 9.4.1。
您需要使用Xcode 10重新编译Swift 4依赖项,因为Swift不是ABI稳定的,即使用不同编译器版本编译的二进制文件不兼容。即使使用不同版本的Xcode编译的Swift 4.0二进制文件也可能不兼容。
我对Carthage没有太多经验,但我猜你应该将Xcode 10作为命令行工具使用,但你必须设置不同的Swift语言版本供Xcode 10使用。它可能应该在项目中(在这种情况下是RealmSwift),或者使用环境变量指定,但恐怕你需要其他人回答更多细节。

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

3

在 Xcode 10 中使用 Realm 需要从源代码进行构建。在终端中输入以下命令:

git clone --recursive https://github.com/realm/realm-cocoa.git

cd realm-cocoa

sh build.sh ios-swift

1
谢谢您的回复。我也可以使用“Carthage update --no-use-binaries”,但是在Xcode 10工具集中,它使用Swift 4.2。我该如何指定Swift 4?这不是一个Carthage问题,而是一个shell环境问题。 - Heliotropix

1
您可以使用多个Swift工具链。下载链接 Swift 工具链下载 安装某个版本后,重新启动 Xcode,在 Xcode 菜单中可以看到工具链选项。

我刚刚升级到Xcode 10.2,但一个外部库在新的SDK上无法工作,而且我收到了Swift 5相同的构建错误。我下载了Swift工具链。现在构建错误已经消失,但在设备/模拟器上运行时会导致崩溃,并显示错误“原因:不兼容的库版本:Instamojo需要1.0.0或更高版本,但libswiftCore.dylib提供的是0.0.0版本”。有什么想法吗? - Anand
你需要更新Instamojo版本或为你的项目构建Instamojo源代码。 - lingyfh

0

我曾经遇到同样的问题,后来意识到我没有将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构建它们,并在之前的Swift 4.2项目中使用它们。但是当我这样做时,Xcode会报错,说它们不能被Swift 4.2编译器导入。我该如何解决这个问题? - Heliotropix
引用你的问题:“但是,我至少想使用Xcode 10。” 对我来说,这意味着你无法构建Xcode 10。但是在这个评论中,你说你可以?我建议你重新表述你的问题并更好地解释你的情况。 - regina_fallangi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接