swift-package-manager - 使用 SwiftPM 导出公共(public) C 头文件

标签 swift-package-manager

我有一个开源的 Objective C 框架,我也想使用 Swift Package Manager 提供它。
通常,我在 Xcode 项目中设置了公共(public)头文件,当构建框架时,这些头文件被复制到框架包下,并在被 Xcode 链接时被发现。
但是我不能让它与 SwiftPM 一起工作。
我为我的框架创建了一个模块映射:

framework module LNPopupController {
    umbrella header "LNPopupController.h"
    export *
    module * { export * }
}
我在 Package.swift 中像这样定义库:
let package = Package(
    name: "LNPopupController",
    platforms: [
        .iOS(.v12),
        .macOS(.v10_15)
    ],
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(
            name: "LNPopupController",
            type: .dynamic,
            targets: ["LNPopupController"]),
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages this package depends on.
        .target(
            name: "LNPopupController",
            dependencies: [],
            path: "LNPopupController",
            publicHeadersPath: ".",
            cSettings: [
                .headerSearchPath("."),
                .headerSearchPath("Private"),
            ]),
    ]
)
当在 Xcode 中作为项目依赖添加时,框架编译得很好,但是当依赖目标尝试 import LNPopupController 时,抛出错误:umbrella header 'LNPopupController.h' not found查看 build 文件夹,确实,我看到 Xcode 已经构建了一个二进制文件,但没有复制公共(public)头文件。
有什么方法可以指定哪些 header 是公共(public)的,并使构建系统复制它们以进行导入?

最佳答案

我终于想通了。这就是我为 LNPopupController 所做的:
我创建了一个 include/LNPopupController/子目录树,并在那里放置指向所有公共(public)标题的软链接(soft link)。
在包文件中,我添加了 publicHeadersPath: "include" .
您可以在此处查看最终结果:
https://github.com/LeoNatan/LNPopupController/blob/master/Package.swift
这可能不是最佳方式,但它适用于我尝试过这种方法的所有 ObjC 项目。

关于swift-package-manager - 使用 SwiftPM 导出公共(public) C 头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63211415/

相关文章:

swift - 生成resource_bundle_accessor,类型 'Bundle'没有成员 'module'

c - Swift 包管理器 C-interop : Non-system libraries

ios - swift 包管理器 'cannot find target' 错误消息

swift - 我可以使用 Swift 包管理器制作本地模块吗?

ios - 更改 Swift Package 中的默认标题注释许可

ios - 我有一个 Swift 包,我想知道如何获取这个包的当前版本

objective-c - 如何解决 Swift Package Manager 目标重叠源错误

swift - 将静态 C 库与 Swift 包管理器一起使用

swift - 如何基于 ObjC 代码创建 SPM 包?

swift - 如何使用 Swift Package Manager 更新单个依赖项?