Xcode 9:使用 Swift 3.1 编译的模块无法在 Swift 4.0 中导入

Posted

技术标签:

【中文标题】Xcode 9:使用 Swift 3.1 编译的模块无法在 Swift 4.0 中导入【英文标题】:Xcode 9 : Module compiled with Swift 3.1 cannot be imported in Swift 4.0 【发布时间】:2017-11-08 00:11:04 【问题描述】:

更新到 Xcode 9 后,我尝试构建我的一个项目。

我使用 FacebookLogin 窗格。 我在 FacebookLogin/LoginButton.swift 中有一个编译器错误

@testable import FacebookCore
❌ Module compiled with Swift 3.1 cannot be imported in Swift 4.0

在我的目标的构建设置中,Swift 语言版本设置为 Swift 3.2

我想我需要等待 Facebook 更新他们的 pod 吗?还是有其他建议?

谢谢!

【问题讨论】:

你可以试试。 Try cleaning the project from Product -> Clean in Xcode 8 and build again. 【参考方案1】:

更新:

该解决方案还在 Swift 5 和 Xcode 11 中进行了测试和工作。

原文:

我想补充一点,如果您使用 Carthage 在 Swift 3.2 中编译模块,您应该转到终端并运行:

sudo xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer

要使用 Xcode 9 命令行工具,你可以运行:

carthage update NameOfTheLibrary --platform ios --no-use-binaries

这将使用您当前的命令行工具编译库,它可能会有点慢,但现在应该构建项目。

注意

要恢复并使用稳定的 Xcode 命令行工具,只需运行:

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

【讨论】:

我在使用 Algolia 框架时遇到了同样的错误,并且使用 carthage 和 Xcode 9 命令工具构建它工作正常!谢谢 使用 SwiftyJson 为我工作。谢谢! 使用 Alamofire 为我工作 嗨@xaviPedrals,我需要你的帮助...我正在尝试运行该项目“github.com/swiftingio/SingTest”但收到错误“Swift 4.2.1 编译器无法导入使用 Swift 3.1 编译的模块:/Users/aliapple/Desktop/SingTestByAhtazaz/Pods/AudioKit/iOS/AudioKit.framework/Modules/AudioKit.swiftmodule/arm64.swiftmodule”。你能帮我吗? 嗨@Mr.Ahtazaz 该项目是2年前的,所以它可能是在Swift 3中制作和编译的,首先项目应该更新到Swift 4或5,然后尝试运行carthage命令@ 987654325@更新库,你应该没事【参考方案2】:

Xcode 9 带有一个 Swift 4 编译器,它可以理解 Swift 3.2 和 swift 4,它甚至可以让你在两个版本之间混合和匹配。很遗憾,不支持其他版本。

即使您将语言设置为 Swift 3.2,它也会使用 Swift 4 编译器。

如果您使用的是 cocoapods,您可以将其添加到您的 pod 文件的末尾,以强制 pod 使用 Swift 3.2 或 4.0:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '3.2'
        end
    end
end

或者,您可以暂时将 pod 中的文件直接放入您的项目中,直到 FacebookLogin 更新到 Swift 3.2 或 4。

注意:根据马特的反馈编辑

【讨论】:

仅供参考 - 强制所有 pod 使用 Swift 4.0 有点过于激进。如果 pod 兼容 Swift 3,您可以安全地升级到 Swift 3.2。升级到 4.0 很可能会导致许多 pod 出现编译器问题。【参考方案3】:

也许您可以在构建目标之前清理它。 对我来说效果很好。

【讨论】:

对我不起作用,仍在寻找其他解决方案。【参考方案4】:

我在 Xcode 9 Beta 3 上遇到了同样的问题,它指向“Alamofire”并尝试了几种不同的解决方案,我发现最简单的一个是

1. CMD+SHIFT+K to clean the build
2. Restart Xcode 9 <-- make sure you do this step, that's critical. `

【讨论】:

现在是 2017 年,我们仍然需要重启 Xcode 来解决 bug。谢谢你,苹果。谢谢。【参考方案5】:

执行“清理构建文件夹”并重新启动 Xcode 9 为我清除了错误。此外,该错误并没有阻止应用程序在我的设备或模拟器上运行。

【讨论】:

"clean build folder":要访问该选项,请打开 Product 菜单并使用 Option 键显示 Clean Build Folder 选项。【参考方案6】:

转到 xcode DerivedData 目录,然后删除其中的所有文件并重新编译您的项目。它对我有用。

默认的 DerivedData 目录是 :~/Library/Developer/Xcode/DerivedData。

【讨论】:

【参考方案7】:

如果使用 Carthage ,打开 terminal 和;

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

如果使用 Pod ,打开 terminal 和;

pod update

(另外,如果不在 pod 中工作,您可以在 podfile 中更改 SWIFT_VERSION Ex:

config.build_settings['SWIFT_VERSION'] = '3.2'

)

之后;

打开Xcode并使用;

Command+Option+Shift+K

【讨论】:

请不要对多个问题发布相同的答案。发布一个好的答案,然后投票/标记以关闭其他问题作为重复问题。如果问题不是重复的,请调整您对该问题的答案。见meta.stackexchange.com/q/104227/311792 @paper1111 我在回答和作品中解释了一切 我正在使用 carthage,这是对我有用的解决方案。迦太基更新“我的框架”没有删减它。我不得不更新整个迦太基目录。花了很长时间,但成功了。 这个解决方案也对我有用。为了确保在使用 Command+Option+Shift+K 清理构建文件夹后关闭并重新启动 xcode。 @SwiftDeveloper config.build_settings 部分去哪儿了?【参考方案8】:

它对我有用。

1.在 Xcode 8 中清理您的项目

2.在 Xcode 9 中构建或运行您的项目

【讨论】:

【参考方案9】:

我在 Xcode 9 中清理了项目,然后运行应用程序,它可以工作。

【讨论】:

【参考方案10】:

我在使用 Xcode 9 GM 时遇到了同样的问题,这解决了我的问题: 从项目中删除它并再次将其拖到“嵌入式二进制文件”中。

【讨论】:

我遇到了 Alamofire 4.5.1 的问题,并通过 pod update 尝试了此页面上的所有其他内容,但没有结果。最后,我将框架直接添加到我的项目中,并将其添加到我的嵌入式二进制文件中【参考方案11】:

清理构建文件夹

Cmd + option + shift + K

【讨论】:

【参考方案12】:

我有

pod 'FBSDKCoreKit'
pod 'FBSDKLoginKit'
pod 'FBSDKShareKit'

在我的项目和import FBSDKLoginKit 中,清理目标后我没有任何问题

由于您使用的 pod 是 swift 并且是 beta pod,因此您可能会遇到 swift 4 编译器的一些问题,您应该暂时使用 Objective-c 版本的 pod

【讨论】:

【参考方案13】:

如果你从 Pod 中使用:

    Podfile 评论FacebookLogin pod

    吊舱安装

    Podfile 中取消注释 FacebookLogin 窗格

    吊舱安装

    再次运行您的项目

【讨论】:

【参考方案14】:

就我而言 - 实际的 pod 引用了一个静态 zip,其中包含针对 swift 3.1 的预构建二进制文件。 因此,唯一的解决方案是使用 xcode 9 的源代码重建框架。

https://github.com/AudioKit/AudioKit/issues/980

【讨论】:

我有一个类似的问题,即在 pod 中引用 AudioKit。但是,您的解决方案是指在“框架”中找到的 build_frameworks.sh 请添加更多详细信息。我找不到这样的文件。 尝试将 podfile 指向较新的版本。使用最新的 xcode 9 构建的版本 - / 无需更改构建脚本。 github.com/AudioKit/AudioKit/releases 感谢您的提示。我不得不将 cocoapods 中的 AudioKit 版本更新到最新版本,其中包含 build_frameworks.sh。需要 build_frameworks.sh 来“验证”AudioKit,以阻止 Apple 拒绝该应用程序。

以上是关于Xcode 9:使用 Swift 3.1 编译的模块无法在 Swift 4.0 中导入的主要内容,如果未能解决你的问题,请参考以下文章

编译 Swift 源文件卡住 xcode 7.3.1

没有这样的模块 'GoogleSignIn' Xcode 9.3 和 Swift 4.1

Xcode 9.2 卡在编译 Swift 3.2 项目中

更新到 Xcode 9 / Swift 4 后 AVCapture 出现奇怪的编译错误 [重复]

Xcode 9.3 编译 Swift 源项目永远不会完成

Xcode 9.3 新增能力,优化 Swift 编译生成代码的尺寸