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


79

更新到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吗?或其他建议?

谢谢 !


您可以尝试将其民间化。
JerryZhou

Answers:


73

更新:

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

原版的:

我想补充一点,如果您正在使用迦太基在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

1
我在使用Algolia框架时遇到了相同的错误,并使用迦太基和Xcode 9命令工具进行了构建,效果很好!谢谢
vmeyer '17

3
使用SwiftyJson为我工作。谢谢!
leandrodemarco

2
使用Alamofire为我工作
pachun

@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”。你能帮我吗?
Ahtazaz

@Ahtazaz先生,您好,该项目来自2年前,因此它可能是在Swift 3中制作和编译的,首先应将项目更新为Swift 4或5,然后尝试运行carthage命令carthage update NameOfTheLibrary --platform iOS --no-use-binaries来更新库,您应该可以
xavi.pedrals,

26

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。

注意:根据Matt的反馈进行编辑


1
仅供参考-强制将所有Pod都移至Swift 4.0,这在某种程度上过于激进。如果Pod兼容Swift 3,则可以放心使用Swift 3.2。升级到4.0很有可能会导致许多Pod出现编译器问题。
Matt S.

19

也许您可以在构建目标之前对其进行清洁。这对我来说可以。


7
不适用于我,仍在寻找其他解决方案。
Arnaud

11

我在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. `

11
现在是2017年,我们仍然需要重新启动Xcode来解决错误。谢谢苹果。谢谢。
奥德·哈斯

10

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


1
“清除构建文件夹”:要访问该选项,请打开“产品”菜单,然后使用Option键显示“清除构建文件夹”选项。
汉斯(Hans)

8

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

默认的DerivedData目录为:〜/ Library / Developer / Xcode / DerivedData。


8

如果使用迦太基,打开终端

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

如果使用Pod,则打开终端

pod update

(此外,如果在Pod中不起作用,则可以在Podfile Ex中更改SWIFT_VERSION:

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

后;

打开Xcode并使用;

Command+Option+Shift+K

在此处输入图片说明


1
请不要针对多个问题发布相同的答案。发表一个好答案,然后投票/标记以将其他问题重复作为一个重复。如果问题不是重复的,请定制问题的答案。参见meta.stackexchange.com/q/104227/311792
paper1111年

@ paper1111我在答复中解释一切和作品
SwiftDeveloper

我正在使用迦太基,这是对我有用的解决方案。迦太基更新“我的框架”没有削减。我不得不更新整个迦太基目录。永远花了,但做到了。
Matan Guttman

1
此解决方案也对我有用。要双重确认,请确保在使用Command + Option + Shift + K清除构建文件夹后关闭并重新启动xcode。
Torsten Ojaperv

@SwiftDeveloper该config.build_settings部分放在哪里?
阿德里安

4

这个对我有用。

1,在Xcode 8中清理项目

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


3

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


2

我在Xcode 9 GM上遇到了相同的问题,这解决了我的问题:将其从项目中删除,然后再次将其拖动到“嵌入式二进制文件”中。


我遇到Alamofire 4.5.1的问题,并尝试了此页面上的所有其他操作,pod update但没有结果。最后,我将框架直接添加到我的项目中,并将其添加到有效的嵌入式二进制文件中
Heki,2017年


1

我有

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

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

由于您使用的Pod是swift且是Beta Pod,因此swift 4编译器可能会出现一些问题,因此暂时应使用Pod的Objective-C版本


0

如果从Pod使用:

  1. Podfile评论中
  2. 吊舱安装

  3. Podfile取消注释FacebookLogin荚
  4. 吊舱安装

  5. 再次运行您的项目

0

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

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


我在Pod内引用AudioKit时遇到类似的问题。但是,您的解决方案引用了在“框架”中找到的build_frameworks.sh。请添加更多详细信息。我找不到这样的文件。
TomV

尝试将podfile指向较新的版本。使用最新的xcode 9构建的版本-/无需更改构建脚本。github.com/AudioKit/AudioKit/releases
johndpope

谢谢你的提示。我不得不将cocoapods中的AudioKit版本更新为最新版本,其中包含build_frameworks.sh。需要build_frameworks.sh来“验证” AudioKit,以阻止Apple拒绝该应用程序。
TomV
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.