2

一些框架文件附带一个module.modulemap包含“链接框架”行的文件。例如,这是对讲机module.modulemap文件的当前内容:

framework module Intercom {
  umbrella header "Intercom.h"

  [...]

  link framework "Foundation"
  link framework "UIKit"
  link framework "Accelerate"
  [...]
}

我想找出为什么这些link framework行是必要的,所以我尝试在 Xcode 10.2 上为框架目标创建一个新项目,但无论我做什么,似乎该module.modulemap文件都不会被触及(这是可以理解的,它似乎这个文件是要手动修改的)。

我想知道的是,为什么这首先是必要的?责备信息+相应的发行说明似乎表明添加了所述行以解决动态框架和重复符号的问题,但仅此而已。

4

1 回答 1

1

有两种方法可以让 Objective-C 框架在 swift 项目中可用:

1)让Xcode自动创建module.modulemap文件,这是启动新框架项目时的默认选项:

定义模块选项

因此,当您编译项目时,将使用默认配置生成此文件:

framework module MODULE_NAME {
  umbrella header "MODULE_NAME-umbrella.h"

  export *
  module * { export * }
}

通常对于大多数项目来说已经足够了。

2)手动生成文件,这是你的项目案例。

根据CLANG 的 modulemap 文档

链接声明指定了一个库或框架,如果封闭模块被导入到该程序的任何翻译单元中,则该程序应链接到该库或框架。

模块映射中的链接声明旨在提示工具链包含模块代码的实际二进制文件是什么。如果没有这个明确的定义,在主项目上导入框架可能会由于需要那些源框架而导致错误,主要是没有这样的模块错误

因此,如果您有一个具有动态框架依赖项的 swift 项目,并且其中一个具有与您的示例框架相同的依赖项列表,如果您从.modulemap文件中删除显式声明,您可能会看到duplicate symbols错误。

有关更多信息,我推荐此 Apple 线程响应。

于 2019-10-12T23:16:12.820 回答