使用 Swift 5.1 编译器无法导入使用 Swift 5.0.1 编译的模块。

41

我有一个 VoiceSampler.framework,它是使用 Xcode 10.3 构建的。

我正在尝试在新项目的 Xcode11 中使用该框架。我已经成功地添加了这个框架,但是当我在 AppDelegate 中编写 import VoiceSample 时,出现以下错误:

使用 Swift 5.1 编译器无法导入使用 Swift 5.0.1 编译的模块: /Users/apple/Projects/CaptureAppSwift/VoiceSampler.framework/Modules/VoiceSampler.swiftmodule/arm64.swiftmodule

是否有可以在 Xcode 11 中调整的构建设置,以使其正常工作? 还有其他解决方法吗?


2
VoiceSampler.framework是什么?如果它是Carthage,则必须更新Carthage。 - kishan vekariya
VoiceSample.framework 是另一个开发者用于采样 MP3 音高/频率的库。我一直在 Xcode 10.3 的项目中使用这个库,没有任何问题。什么是 Carthage?我要如何/在哪里更新 Carthage? - Bharat Biswal
问题出在Xcode上,因为xcode 11支持swift 5.1,而你的框架是用swift 5.0.1编写的。为了解决这个问题,要么将Xcode版本降级到10.3,要么获取最新版本的VoiceSample.framework。 - Adi.S
8个回答

32

这个问题是由于您尝试嵌入一个使用不同编译器版本创建的预编译框架所导致的。

目前,只有在编译器版本匹配时才能嵌入预编译框架!用于编译项目的Swift编译器版本必须与用于编译框架的版本相同。

希望将来Swift/编译器版本中可以取消这种限制...了解更多信息,请参考此处关于“模块稳定性”的章节:https://swift.org/blog/abi-stability-and-more

正如某些评论中已经提到的,解决这个问题的方法是升级或降级到适当的Xcode版本。(或者如果可能的话,重新使用所需的编译器版本重新编译框架,然后在项目中使用相同的编译器版本。)


4
我已经重新编译了SDK以适配5.1版本并上传,但是当我通过Cocoapods安装SDK时,它又回到了5.0.1版本。有没有什么解决办法? - Albi
5
从2020年4月开始,如果您降级Xcode,则无法提交应用程序。如果将Build libraries for distribution设置为YES,那么它会给您带来大量其他错误。那么有没有解决方法呢? - Niraj

6

我在使用Sqlite.swift时遇到了类似的问题。执行以下命令解决了我的问题:

carthage update --platform iOS --no-use-binaries

这个建议来自于这里


假设所有东西都由Carthage提供是无效的。不幸的是,一些提供者通过邮件或在网页上提供fat二进制下载来提供他们的框架。 - Nat

5

只需要在您的框架构建设置中将为分发构建库选项设置为


6
在我打开了“构建分发库”开关之后,它给我返回另一种类型的错误,即“<unknown>:0: error: using bridging headers with module interfaces is unsupported”。 - zionpi
@zionpi,你有解决方案了吗?我也遇到了同样的问题。 - Ankit Goyal
@AnkitGoyal 这是我的建议。如果你的项目引用了导致这种问题的“第三方库”,那么请向“第三方库”提供者请求正确版本,或者降级你的XCode版本以匹配“第三方库”的Swift版本。 - zionpi

2
如果你使用React Native来构建你的应用程序,请转到Xcode并单击文件->工作区设置...-> 如果你注意到有一个小箭头,那就是DerivedData文件夹的路径,请单击该箭头,实际文件夹将与其他iOS相关文件夹一起出现,删除DerivedData文件夹并重新构建你的应用程序。现在一切都会顺利运行...感谢我以后再说吧。

1
正如我这里已经描述的那样,VoiceSample的提供者应该使用BUILD_LIBRARY_FOR_DISTRIBUTION = YES;重新构建框架。在这种情况下,您将能够在所有Swift版本中使用VoiceSample。

1
以下命令解决了编译错误:
  1. carthage bootstrap --platform ios
  2. brew bundle
  3. pod repo update

这应该是被接受的答案。被接受的答案提供了笼统的概括,而不是精确的解决方案。 - Andreas ZUERCHER

0

您需要在框架的构建设置中将“用于分发构建库”选项设置为“是”,否则 Swift 编译器不会生成必要的 .swiftinterface 文件,这些文件是未来编译器能够加载旧库的关键。

此选项最终出现在您的 project.pbxproj 文件中:

BUILD_LIBRARY_FOR_DISTRIBUTION = YES;

设置了这个标志后,我使用 Xcode 11.0(swift 5.1)编译的框架可以在 Xcode 11.2(swift 5.1.2)下编译,并且一切似乎都正常工作。


2
重复答案 https://dev59.com/vFMH5IYBdhLWcg3wtRYg#58656323 - oguzhan

0
在我的情况下,问题出现在Carthage上。所以我在Finder中从项目的根文件夹中删除了这些文件:
Cartfile.resolved, Carthage/
然后启动了carthage bootstrap --platform iOS(因为我不需要更新Carthage)。
但是如果您需要更新Carthage,那么您不需要删除文件。只需输入命令carthage update --platform iOS即可解决此问题。

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