1

我正在构建这个Swift静态库:OxfordLibrary我最终想使用 XCFramework 分发它。

我有一些想要从 Swift 访问的 ObjC/C++ 代码。由于我们不能在静态库中使用 ObjC 桥接头(创建 XCFramework 时抛出错误),所以我尝试使用模块映射文件。

所以想法是将 ObjC/C++ 代码库保持在库内部/私有,并且只通过 Swift 公开 API。

所以我创建了以下内容:

/// FILE: module.modulemap

module OxfordLibrary {
    export *
}
/// FILE: module.private.modulemap

module OxfordLibrary_Private {
    umbrella header "OxfordLibrary-objc-umbrella.h"
    export *
}

我已经设置并在构建设置中Defines Module: YES设置了 swift 。Seach Path

现在在我的主要 Swift 文件中:

/// FILE: OxfordLibrary.swift

#import OxfordLibrary_Private

open OxfordLibrary{
    public static func foo() {
        SomeObjcClass.someObjcMehtod()    // Final aim
    }
}

现在如果不导入OxfordLibrary_Private,我将无法SomeObjcClass快速访问。美好的。添加导入后它可以工作。

这甚至可以正确构建。

但是,当我从中创建 XCFramework 并将该 XCFramework 导入到客户端应用程序项目时,import OxfordLibrary它会抛出错误OxfordLibrary_Private模块未找到/未定义。

在做了一些研究之后,我发现我需要在 Modules 文件夹中或使用 -headers 标志将模块映射文件和头文件复制到 XCFramwork。如果我这样做,它会起作用。

但问题是:它的 private.modulemap 应该是私有的并且在库之外不可用?

因为现在我可以import OxfordLibrary_Private在客户端应用程序中进行操作并在那里访问任何 ObjC 方法。

4

0 回答 0