找不到来自子项目(框架)的模块

Posted

技术标签:

【中文标题】找不到来自子项目(框架)的模块【英文标题】:Module from sub-project (framework) can't be found 【发布时间】:2017-07-18 16:08:01 【问题描述】:

我正在使用 XCode 8 + Swift 3。

我创建了一个名为“MyApp”的全新 ios 项目。 然后,我创建了一个名为“MySubProject”的 Cocoa touch framework 项目。 (这个想法是让 MyApp 项目访问 MySubProject 代码。)

它们在同一级别的文件夹中:

- MyApp/
- MySubProject/

MySubProject中,我在服务组/文件夹下有一个MyService.swift 文件(它是MyService 类):

代码很简单:

import Foundation
public class MyService 
    public func greeting() -> String 
        return "Hello my service!"
    

MyApp中,我将MySubProject.xcproject作为MyApp下的子项目添加到MyApp项目中:

然后,我将MySubProject/Products/ 下的MySubProject.framework 拖放到MyApp 项目的General --> Embedded Binaries and Linked Framework and Libraries:

现在,在MyApp/ViewController.swift 下,我从MySubProject 导入MyService 类:

但是当我构建 MyApp 项目时,我总是收到编译器错误“No such module 'MyService'”,如上图所示。

为什么?如何让MyApp能够访问MySubProject代码?

【问题讨论】:

我很惊讶没有人知道如何修复它??? 【参考方案1】:

导入我的子项目!不是 myService ...在将框架复制到应用程序之后,请查看快照。我不能发图。 snapshot

【讨论】:

谢谢。实际上,唯一的问题是我应该导入MySubProject 而不是MyService。我不需要复制框架,因为我已经在“嵌入式​​二进制”和“链接框架和库”中添加了框架,如果您在我的问题中看到我的屏幕截图。 再次阅读您的问题后,我认为 hasayakey 是对的。必须导入框架,而不是文件。请尝试一下。【参考方案2】:

MySubProject 是否启用了“定义模块”设置?

【讨论】:

“定义模块”设置在哪里? 是的,已启用。 检查子项目的产品模块名称设置。这需要与您在导入命令中使用的任何内容相匹配。因此,如果它默认为 MySubProject,并且您尝试导入 MyService,它将找不到它。您可以导入 MySubProject,或将产品模块名称更改为 MyService - 只要它们匹配即可。【参考方案3】:

编辑: 您可以检查几件事:

要在您的主项目中找到,您的框架必须编译到相同的目标,即如果您的主项目以 iOS 作为目标,您的子项目也必须以 iOS 作为目标(而不是,例如 watchOS)。 在项目导航器中激活项目。这将显示一个包含项目和目标设置的窗格。激活您的目标并选择“常规”选项卡。在部署信息下,您可以检查目标类型。

要导入主项目,必须在主项目开始构建时构建框架,即必须以正确的顺序完成。 可以适当地选择此顺序:在 Xcode 窗口的顶部栏中(最左侧带有红色/黄色/绿色窗口控制按钮的那个),停止按钮的右侧是活动方案左侧和所选设备右侧的字段。单击方案会打开一个子菜单。选择 Edit scheme(这也可以通过 Product/Scheme/Edit scheme 从 Xcode 主菜单中完成)。在左侧窗格中选择构建。在右侧,您将看到您的目标。它们将从上到下建造。因此,您的框架必须在最上面,因为您的主项目在开始构建时需要将其导入。您可以通过相应地拖动目标来更改顺序。

还有一件事:在目标上方,有一个复选框“Parallelize Build”。这个千万不能查!如果勾选,你的主项目和你的子项目可以同时构建,这是行不通的,因为子项目必须在主项目开始构建时完全编译。

而且,最终,您必须导入您的框架(正如 hasayakey 在此答案中建议的那样,+1),而不是框架的特定文件)。

之前的建议: 您的子项目文件“MyService”(或无论如何调用)是否启用了“MyService”的目标成员资格?

【讨论】:

这是我第一次听到“目标会员”这个词,它在哪里以及如何启用它? 在 Xcode Project Navigator(左窗格)中,激活“MyService.swift”(蓝色背景)。打开右侧的实用程序窗格(顶部栏,最右侧的按钮)。然后窗格将显示带有复选框的“目标成员资格”。必须选中您的目标框,否则 MyService 将不会包含在您的目标中,并且无法找到。 谢谢。已检查。那里没问题。目标成员是“MySubProject”

以上是关于找不到来自子项目(框架)的模块的主要内容,如果未能解决你的问题,请参考以下文章

无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

找不到模块:错误:无法解析模块“fs”

ld:找不到框架 Parse Xcode 7 beta

使用 src=require() 时,来自 webpack 的 Vue.js 错误“找不到模块 './undefined'”

Rails 6 webpacker找不到已安装模块的模块

带有 AWS Lambda 错误“找不到模块”的无服务器框架