昨天我的Mac决定将Xcode 11自动更新为12,但是,我仍然需要Xcode11。因此,我直接从https://developer.apple.com/download/more/安装了11.7。
现在,我的所有项目都无法构建,并显示错误module 'Builtin' has no member named convertUnownedUnsafeToGuaranteed
。总是在编译某些框架(例如Alamofire)时使用,但是在每个项目中它都是不同的框架。这些项目都设置为使用Swift 5。
我重新安装了Xcode 12命令行工具,但没有帮助。我尝试安装Xcode 11命令行工具,但是安装程序告诉我我的操作系统太新了(我使用的是Big Sur 20A5374g)。
xcode从一个切换到另一个并没有帮助。也没有任何数量的项目清理/删除构建文件夹。
Google说,我是唯一遇到这种情况的人。还有谁?想法?
答案 0 :(得分:0)
我不完全了解发生此错误时发生的内部问题,但我已经找到了在本地系统上解决它的方法。 (Mojave,Xcode 11.7)我的特殊问题是我插入了 iOS 14 SDK 代替了最初随附的 iOS 13 SDK Xcode 11.7。它只会在尝试构建任何 swift 代码时给我带来问题。 (我个人尽量避免像瘟疫一样)
我最终编写了一个脚本,该脚本在我的 iOS 14 和 iOS 13 SDK 文件夹之间来回更改以暂时“解决”问题,但从进一步调查来看,这似乎是我一直怀疑的:需要更新swift 工具链(ABI 稳定性如此之高,嗯?)
新版本 Xcode 附带的 swift 工具链必须将此功能添加到“内置”中(如上面链接中提到的类似)
我没有尝试安装任何通过 swift 5.0 工具链的东西,但我认为尝试安装更新的工具链可能会更恰当地缓解这个问题。
编辑:经过进一步调查,安装这些工具链不会让您构建到设备,但是,如果您准备好动手(如果这再次发生,或发生在其他人身上)
如果您在文本编辑器中打开以下文件(我是在 vim 中完成的)/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/swift/Swift.swiftmodule/arm64-apple-ios.swiftinterface
并搜索“convertUnownedUnsafeToGuaranteed”,您应该会遇到此功能:
@inlinable @_transparent public func _withUnsafeGuaranteedRef<Result>(_ body: (Instance) throws -> Result) rethrows -> Result {
var tmp = self
// Builtin.convertUnownedUnsafeToGuaranteed expects to have a base value
// that the +0 value depends on. In this case, we are assuming that is done
// for us opaquely already. So, the builtin will emit a mark_dependence on a
// trivial object. The optimizer knows to eliminate that so we do not have
// any overhead from this.
let fakeBase: Int? = nil
return try body(Builtin.convertUnownedUnsafeToGuaranteed(fakeBase,
&tmp._value))
}
你可以使用标准的 /* */ 注释掉它,然后把它放在它的位置,它/应该/通过那个错误。
@inlinable public func _withUnsafeGuaranteedRef<Result>(_ body: (Instance) throws -> Result) rethrows -> Result {
let (guaranteedInstance, token) = Builtin.unsafeGuaranteed(_value)
let result = try body(guaranteedInstance)
Builtin.unsafeGuaranteedEnd(token)
return result
}
如果你好奇我在哪里找到这个函数,它在同一个文件的 iOS 13.x SDK 版本中。位于:(如果您在任何地方安装了带有 iOS 13 SDK 的 XCode)/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/swift/Swift.swiftmodule/arm64.swiftinterface
如果您想查看正在使用 xcrun 构建的 iOS SDK 的确切路径,这将非常有帮助:
xcrun --sdk iphoneos --show-sdk-path
产量:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
据推测,您需要针对您所针对的任何其他架构(即 arm64e-apple-ios.swiftinterface)等重复这些步骤。