背景:我正在将大型的旧混合语言代码库转换为框架。我遇到了问题,因此我认为我将从一个最小的测试项目开始,以了解其工作原理。我遇到了更多问题。这是带有Xcode 10.2.1的Swift 5.0。

我创建了一个名为TestFramework的新iOS框架项目。 TestFramework具有以下源文件:

  • OCTest.[hm],带有一个 private 类
  • OCPublic.[hm],具有一个 public 类。它调用OCTest。
  • STest.swift,具有一个 public 类。它同时调用OCPublic和OCTest。

  • 我还有以下两个伞形标头,与源文件位于同一文件夹中:
  • TestFramework.h,它是自动创建的一个Xcode。我只添加了#import "OCPublic.h"
  • TestFramework_Private.h。它有两行:

    #include "TestFramework.h"
    #include "OCTest.h"
    

  • 它们都与TestFramework一起存放在Info.plist文件夹中,Xcode会自动创建其他所有内容。

    我设法进行了编译,使用carthage build --archive构建了一个框架包,并在具有以下模块映射和构建设置的测试应用程序中成功使用了生成的框架:
  • TestFramework/module.modulemap存在且为空。
  • TestFramework/module.private.modulemap存在以下几行:
    module TestFramework_Private {
        umbrella header "TestFramework_Private.h"
        export *
    }
    
  • 构建设置中的MODULEMAP_FILEMODULEMAP_PRIVATE_FILE均未设置。
  • SWIFT_INCLUDE_PATHS$(PROJECT_DIR)/TestFramework
  • DEFINES_MODULE为true。

  • 如果我将任何内容(framework module TestFramework { … })添加到module.modulemap或尝试使MODULEMAP_FILEMODULEMAP_PRIVATE_FILE指向它们的文件(使用TestFramework/module.modulemapTestFramework/module.private.modulemap值),则会遇到各种构建错误(找不到TestFramework_Private,重新定义模块TestFramework等)。

    如果我删除了空的主模块映射,那么在STest.swift尝试导入该模块的情况下,不会得到此类模块'TestFramework_Private'。

    如果我尝试将 private 物品移动到单独的文件夹中并更改SWIFT_INCLUDE_PATHSMODULEMAP_PRIVATE_FILE,则会收到更多的构建错误。

    在主模块映射中是否包含内容,是否可以使用MODULEMAP *设置一些值?如果要将内容移到不同的文件夹中怎么办?

    最佳答案

    看来至少我的某些问题是由this引起的:

    当构建在源和安装目录中都定义了相同模块的模块映射的框架时,编译器将显示一条重新定义消息。 (28638816)
    解决方法:将源目录中的模块映射文件重命名为非默认名称(默认名称为module.modulemap或module.map),然后将“模块映射文件”构建设置设置为重命名的模块映射。

    将模块映射文件重命名为module.modulemap之外的其他名称(例如整个Clang documentation中使用的名称),可以将MODULEMAP_FILE指向该文件,并使我可以将标头移动到其他位置等。

    10-06 06:37