clang (objective-C) 模块和 Swift 模块有什么区别?

Ben*_*rth 3 clang swift

Clang 模块记录在此处,Swift 模块记录在此处,但没有详细介绍。

由于 clang 是 Swift 内部也使用的 LLVM 前端编译器,那么 Swift 模块是否始终是 Clang 模块?它们是完全相同的东西吗?

Ben*_*rth 5

他们是不同的。但在构建过程结束时,它们都需要链接到应用程序/库的其他.o文件.dylib才能运行。

\n

斯威夫特模块

\n
    \n
  • 来自 Swift Serialization.md 文档

    \n
    \n

    Swift 代码分发的基本单位是模块。模块包含作为接口的声明,供客户端编写代码。

    \n
    \n
  • \n
  • Swift 访问控制文档

    \n
    \n

    模块是代码分发的单个单元:\xe2\x80\x99s 作为单个单元构建和发布的框架或应用程序,并且可以由另一个模块使用 Swift\xe2\x80\x99s import 关键字导入。

    \n
    \n
  • \n
  • .target()由\'s配置Package.swift

    \n
  • \n
  • 不能有子模块,因此用户不能import Module.Submodule在 Swift 中使用。用户仍然可以导入特定实体,import struct PackageModel.Manifest但这比导入子模块要详细得多。

    \n
  • \n
  • 它的接口以.swiftmodule. 什么是 . swiftmodule。文档

    \n
    \n

    从概念上讲,包含模块接口的文件与特定库的 C 头文件集合的用途大致相同。

    \n
    \n
  • \n
  • \n
    \n

    编译器会.swiftmodule多次生成此文件,就像生成的 Objective-C 标头一样,但它不是文本,而是二进制表示。它包含可内联函数的主体,很像 Objective-C 中的静态内联函数或 C++ 中的标头实现。然而,Swift 模块确实包含私有声明的名称和类型。这允许您在调试器中引用它们,但这确实意味着您不应该在最深的秘密之后命名私有变量。来自 WWDC 2018:Xcode 构建过程的幕后故事

    \n
    \n
      \n
    • 因此,私有声明会在您的(Swift 模块接口)中公开.swiftmodule
    • \n
    \n
  • \n
  • 当将纯 Objective-C 框架导入 Swift 时,Swift 编译器使用其内置的 clang 编译器来导入 Objective-C 标头。

    \n
  • \n
\n
\n

导入器在 Clangs 中.modulemap为该框架公开的标头中查找声明。(再次来自 WWDC2018)

\n
\n
    \n
  • 将 Objective-C + Swift 框架导入 Swift 时,Swift 编译器使用Umbrella 标头
  • \n
\n

铿锵模块

\n
    \n
  • 通过文件配置YourModuleName.modulemap(以前是module.map,但已弃用),格式如下
  • \n
  • 可以有子模块,例如std模块有std.iostd.complex
  • \n
  • clang 模块公开模块映射中指定的头文件。私人详细信息(在.m)根本不会暴露。
  • \n
  • 是对原始#include#import样式导入的改进,以改进构建过程(这是一个大主题,请阅读Clang 模块文档)。
  • \n
\n