4

背景:我正在将大型旧混合语言代码库转换为框架。我遇到了问题,所以我想我会从一个最小的测试项目开始,看看事情是如何工作的。我遇到了更多的问题。这是带有 Xcode 10.2.1 的 Swift 5.0。

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

  • OCTest.[hm], 有一个私有类
  • OCPublic.[hm],只有一个公共类。它调用 OCTest。
  • STest.swift,只有一个公共类。它同时调用 OCPublic 和 OCTest。

我还有以下两个伞头,与源文件位于同一文件夹中:

  • TestFramework.h,这是自动创建的一个 Xcode。我只加了#import "OCPublic.h"
  • TestFramework_Private.h. 它有两行:

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

它们都与Xcode 自动创建的所有其他内容TestFramework一起位于该文件夹中。Info.plist

我设法通过carthage build --archive以下模块映射和构建设置在测试应用程序中成功编译、构建框架包并使用生成的框架:

  • TestFramework/module.modulemap存在并且是空的。
  • TestFramework/module.private.modulemap存在以下几行:

    module TestFramework_Private {
        umbrella header "TestFramework_Private.h"
        export *
    }
    
  • MODULEMAP_FILE和in buildMODULEMAP_PRIVATE_FILE设置都未设置。

  • SWIFT_INCLUDE_PATHS$(PROJECT_DIR)/TestFramework
  • DEFINES_MODULE是真的。

如果我将任何内容 ( framework module TestFramework { … }) 添加到module.modulemap或尝试制作MODULEMAP_FILEMODULEMAP_PRIVATE_FILE指向他们的文件(使用值TestFramework/module.modulemapTestFramework/module.private.modulemap

STest.swift如果我删除空的主模块映射,我会在尝试导入它的地方得到 No such module 'TestFramework_Private' 。

如果我尝试将私有内容移动到单独的文件夹中并进行更改SWIFT_INCLUDE_PATHSMODULEMAP_PRIVATE_FILE则会出现更多构建错误。

* 设置是否有一些MODULEMAP应该起作用的值,在主模块映射中有或没有内容?如果我想将东西移动到不同的文件夹中,我应该怎么做?

4

1 回答 1

3

看来至少我的一些问题是由这个引起的:

当构建在定义相同模块的源目录和安装目录中都有模块映射的框架时,编译器将显示重新定义消息。(28638816)

解决方法:将源目录中的模块映射文件重命名为非默认名称(默认名称为 module.modulemap 或 module.map),并将模块映射文件构建设置设置为重命名的模块映射。

将我的模块映射文件重命名为除Clang 文档module.modulemap中使用的名称以外的任何名称,使指向它成为可能,并允许我将标题移动到不同的位置等。MODULEMAP_FILE

于 2019-05-22T14:38:53.067 回答