【问题标题】:Are "link framework" lines necessary in a modulemap file?模块映射文件中是否需要“链接框架”行?
【发布时间】:2019-10-04 10:55:32
【问题描述】:

一些框架文件带有module.modulemap,其中包含“链接框架”行。比如这里是Intercom's module.modulemap file的当前内容:

framework module Intercom {
  umbrella header "Intercom.h"

  [...]

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

我想知道为什么link framework 行是必要的,所以我尝试使用 Xcode 10.2 为框架目标创建一个新项目,但无论我做什么,似乎module.modulemap 文件都会简单地保持不变(这是可以理解的,这个文件似乎是要手动修改的)。

我想知道的是,为什么这首先是必要的? blame info + corresponding release notes 似乎表明添加了上述行是为了解决动态框架和重复符号的问题,但仅此而已。

【问题讨论】:

    标签: ios module-map


    【解决方案1】:

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

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

    所以,当你编译项目时,会使用默认配置生成这个文件:

    framework module MODULE_NAME {
      umbrella header "MODULE_NAME-umbrella.h"
    
      export *
      module * { export * }
    }
    

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

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

    根据CLANG's modulemap documentation

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

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

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

    更多信息,我推荐this Apple thread回复。

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2023-04-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多