Xcode:缺少必需的模块错误

Posted

技术标签:

【中文标题】Xcode:缺少必需的模块错误【英文标题】:Xcode: missing required module error 【发布时间】:2017-04-09 12:40:17 【问题描述】:

我已经查看了类似问题的答案,但我仍然感到困惑。

背景

我有一个项目正在运行,但我正试图在 Xcode 8.3.1 中重新创建它。我首先使用具有一个依赖项的 Swift 包管理器:[.Package(url: "https://github.com/OpenKitten/MongoKitten.git", majorVersion: 3)]。然后我按照我的笔记从 Cocoa 转换到 ios(因为 SPM 不直接支持 iOS),这在以前的项目开始时工作:

    制作启动Package.swift文件 swift package generate-xcodeproj 在 Xcode 中打开项目 项目:构建设置:基础 SDK ==> 更改为 IOS 编辑器:添加目标:(iOS ...单视图应用程序) 选择你的项目,查看目标列表,找到你新添加的目标:General : Deployment Info 在工具栏上,更改“活动方案”

一切似乎都很好,我的项目包括 MongoKitten 和它所依赖的一堆其他框架。其中之一称为“CLibreSSL”。我将所有框架作为目标添加到我新创建的目标中。

错误信息

我可以将 MongoKitten “导入”到我的视图控制器中(使用自动完成功能)。但是,当我编译时,我会收到此错误消息(即使我个人没有尝试导入 CLibreSSL):

Compile Swift source files 
[... bunch of stuff referring to my new target and the viewcontroller ...] 
<unknown>:0: error: missing required module 'CLibreSSL' 

不能“导入 CLibreSSL”到我的视图控制器中(没有自动完成识别)。我注意到,当我转到与 MongoKitten 相关的源文件时,它们确实在其导入语句中成功识别了 CLibreSSL。我什至可以删除它们并通过成功的自动完成重新输入。

问题

我意识到当我像我一样创建一个新目标时,我可能需要做一些额外的事情,这可能与搜索路径有关,但我尝试了很多东西,结果并没有改变。有人可以告诉我如何解决这个问题(并且请不要假设我有太多的知识,因为我觉得这些东西令人困惑)?

如果您需要更多信息,请告诉我。谢谢

【问题讨论】:

【参考方案1】:

在 iOS 应用程序中包含 Vapor 时,我遇到了同样的问题“缺少必需的模块 'CLibreSSL'”。 修复非常简单,应该也适合您:

转到您项目的构建设置。找到标题Swift Compiler — Search Paths。在 Import Paths 中,使用 $SRCROOT 添加到 C 库文件夹的相对路径。如果您的文件夹包含子文件夹,请选择递归选项。

这是来自here的提示

编辑 2017 年 5 月 26 日:正如 cmets 中所建议的那样 - 在使用真实设备时,我的解决方案也不适用于我。我只是在模拟器中玩耍,这个修复有帮助。很抱歉造成混乱。 在为真实设备编译时,由于缺少头文件(例如&lt;sys/vmmeter.h&gt;),CLibreSSL/getentropy_osx.c 无法编译 - 所以底线:我的建议仅适用于模拟器。 :-/

【讨论】:

谢谢。我会记住这个答案,但在这种特殊情况下它并没有解决它。 这对我也不起作用......独角鲸,你找到解决方案了吗? 在搜索路径部分设置标题搜索路径是正确的方法。如果框架依赖于其他一些 c 框架(定义为外部依赖),则 c 框架位于单独的模块中。在这种情况下,必须指示编译器如何编译它。检查 c 编译器的 -fmodule-map-files= 参数。使用 swiftc 的 -Xcc 参数将其传递给 c 编译器。在依赖框架中找到 module.modulemap 并将其用作值。一个示例“-Xcc -fmodule-map-file=$(SRCROOT)/ClibWrapperTest.xcodeproj/GeneratedModuleMap/Clib/module.modulemap” 嗨@user3441734,但是如何在Xcode中设置“-Xcc -fmodule-map-file”,你能提供更多信息吗?谢谢 @User9527 构建设置 -> 其他 Swift 标志【参考方案2】:

按照 user3441734 的建议添加“Other Swift Flags”构建设置为我修复了它。依赖 CLibreSSL 模块的库(在我的情况下为 OpenCloudKit)可以找到它似乎很奇怪,但我导入 OpenCloudKit 的应用程序不能没有帮助。作为参考,我的嵌套在导入到我的应用程序中的 SPM 生成的 Xcode 项目(名为“Dependencies”)中,构建设置为-Xcc -fmodule-map-file=$(SRCROOT)/Dependencies/.build/x86_64-apple-macosx10.10/debug/CLibreSSL.build/module.modulemap。请注意,这似乎有点脆弱,因为它有一个硬编码到文件名中的 macOS 版本,我认为如果它更新到更高版本可能会中断。另请注意,在我的情况下,不需要 Search Paths 构建设置,只需要 Other Swift Paths 设置。

【讨论】:

以供将来参考,这也为我使用包装 C 库的 SPM 项目解决了问题。我一直在按照论坛here 中引用的将 SPM 项目嵌入 Xcode MacOS 项目的建议路线进行操作

以上是关于Xcode:缺少必需的模块错误的主要内容,如果未能解决你的问题,请参考以下文章

Swift 应用程序:导入静态库的框架时“缺少必需的模块”

Xcode - @IBDesignables - X.framework 缺少必需的代码签名

我该如何解决问题:模块/ contrib / redirect / modules / redirect_404中缺少必需的键(核心)?

在 Swift Playground 中导入使用 Firebase 的框架(“缺少必需的模块 'Firebase'”)

Swift 和 Cocoapods - 缺少必需的模块

Cloudinary 错误:“错误”:“消息”:“缺少必需的参数 - 时间戳”