使用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.