【问题标题】:Xcode 9 : Module compiled with Swift 3.1 cannot be imported in Swift 4.0Xcode 9:使用 Swift 3.1 编译的模块无法在 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 吗?还是有其他建议?

谢谢!

【问题讨论】:

标签: ios cocoapods facebook-login xcode9-beta swift4


【解决方案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 中使用:

            1. Podfile 评论FacebookLogin pod
            2. 吊舱安装

            3. Podfile 中取消注释 FacebookLogin 窗格
            4. 吊舱安装

            5. 再次运行您的项目

            【讨论】:

              【解决方案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 拒绝该应用程序。
              猜你喜欢
              • 2018-04-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-25
              • 1970-01-01
              • 1970-01-01
              • 2018-01-09
              • 1970-01-01
              相关资源
              最近更新 更多