gpt4 book ai didi

ios - 混合 Objective-C/Swift 框架的模块映射位置和编译器设置

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:58:55 26 4
gpt4 key购买 nike

背景:我正在将一个大型旧的混合语言代码库转换为一个框架。我有问题,所以我想我会从一个最小的测试项目开始,看看事情是如何工作的。我遇到了更多问题。这是带有 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 构建框架包,并在具有以下模块映射和build设置的测试应用程序中成功使用生成的框架:

  • TestFramework/module.modulemap 存在且为空。
  • TestFramework/module.private.modulemap 存在这些行:

    module TestFramework_Private {
    umbrella header "TestFramework_Private.h"
    export *
    }
  • build设置中的 MODULEMAP_FILEMODULEMAP_PRIVATE_FILE 均未设置。

  • SWIFT_INCLUDE_PATHS$(PROJECT_DIR)/TestFramework
  • DEFINES_MODULE 为真。

如果我将任何内容(framework module TestFramework { … }})添加到 module.modulemap 或尝试制作 MODULEMAP_FILE MODULEMAP_PRIVATE_FILE 指向他们的文件(具有值 TestFramework/module.modulemapTestFramework/module.private.modulemap)我得到各种构建错误(不能找到TestFramework_Private,重新定义模块TestFramework等)

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

如果我尝试将私有(private)内容移动到单独的文件夹并更改 SWIFT_INCLUDE_PATHSMODULEMAP_PRIVATE_FILE,我会遇到更多构建错误。

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

最佳答案

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

When building a framework that has module maps in both the source and the install directories that define the same module, the compiler will show a redefinition message. (28638816)

Workaround: Rename the module map file in the source directory to a non-default name (the default name is module.modulemap or module.map), and set the Module Map File build setting to the renamed module map.

将我的模块映射文件重命名为 module.modulemap 以外的任何名称 — 例如,在 Clang documentation 中使用的名称— 可以将 MODULEMAP_FILE 指向它,并允许我将 header 移动到不同的位置等。

关于ios - 混合 Objective-C/Swift 框架的模块映射位置和编译器设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56185135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com