使用Swift 5.1编译的模块不能由Swift 5.1.2编译器导入


91

我有一个框架(在本例中为RxSwift),已使用Xcode 11.0将其编译为传统RxSwift.framework样式包

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

今天,在Apple发布Xcode 11.2之后,我进行了升级,并看到以下错误消息:

使用Swift 5.1编译的模块不能由Swift 5.1.2编译器导入

我习惯于迅速地编译不匹配的东西,而且我知道我可以使用Xcode 11.2重新编译RxSwift并继续进行,但是Swift 5.1的主要特点是模块稳定性

我给人的印象是,既然我们已经有了模块稳定性,那么框架就不需要继续与每个新的Xcode版本一起重新编译,但是事实并非如此。

如果有人能解释这里发生的事情,我将不胜感激。Xcode 11.2是否存在错误?还是我最初用Xcode 11.0编译时需要某种方式告诉它我想要模块稳定性吗?



对我来说,具有较早版本的工具链可以工作:stackoverflow.com/a/43142147/5846135
Zeero0

Answers:


107

是的,结果证明如果您观看WWDC视频,他们会对其进行解释:https : //developer.apple.com/videos/play/wwdc2019/416/

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

最终在您的project.pbxproj文件中显示为:

BUILD_LIBRARY_FOR_DISTRIBUTION = YES;

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

希望这个问题/答案将为所有未观看所有WWDC视频的人提供有用的参考

如果错误仍然存​​在,请转至产品 > 清理构建文件夹,然后再次构建


1
太棒了!现在,让我们希望所有第三方框架的开发人员都能发现这一点-哈哈:)
Mihai Fratu

25
这对我来说没有帮助。我将其设置为“是”,但是仍然出现错误。有任何想法吗?
davidOhara

3
我正在使用Carthage和10个框架... ish。是否carthage足够聪明,可以从我的 .pbxproj文件中进行选择,或者如上面的@MihaiFratu所述,所有第三方框架开发人员是否需要在自己的框架项目中自行设置?
nteissler

9
在我的情况下,@ davidOhara与Xcode 11.2中的此已知问题有关:如果使用BUILD_LIBRARIES_FOR_DISTRIBUTION构建模块,并且包含与模块本身名称相同的公共类型,则客户端将无法导入该模块。在Xcode 11.2发行说明(19481048)(FB5863238):developer.apple.com/documentation/xcode_release_notes/...
理查德Chirino

2
@davidOhara遗憾的是我还没有找到解决方法。对我们来说,重命名该类也是不可能的,因为它是我们框架的主要类,并且会破坏客户的代码。如果我使用Xcode 11.2构建框架,则可以在Xcode 11.2上编译,但不能在11.1或更早版本上编译。今天的Xcode 11.2.1 GM版本尚未解决此问题。如果您想关注它,这是快速问题跟踪器上的票:bugs.swift.org/browse/SR-11704上还附有雷达。
理查德·奇里诺

2

导入第三方库时出现相同的错误。我使用Xcode中的工具链修复了该问题,并从此处https://swift.org/download/#releases获取 2019年9月19日的版本。在那之后,我不得不重新导入我的库,并且它起作用了。


这是最简单的解决方案,谢谢
Krishan Patel

我在使用Swift 5.1.2编译的框架模块上遇到问题,无法通过Swift 5.2.2导入。如何解决此问题?
Kishan Suthar

0

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

基本上,迦太基为您提供了类似的传统RxSwift.framework样式包

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


不赞成投票,因为使用迦太基,您只是在新的编译器上重建您的库。问题明确地是关于加载由先前的编译器构建的二进制库
Orion Edwards

0

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

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

brew bundle?它有什么作用?
skywinder

不赞成投票,因为使用迦太基将在新的编译器上重建库。问题明确地是关于加载由先前的编译器构建的二进制库
Orion Edwards
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.