gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:55:45 25 4
gpt4 key购买 nike

我如何使用 Swift 包管理器来包含 C 代码(在我的例子中,单个 .c 文件和一个头文件) 不需要用户安装我的 C 库到 /usr/local/lib?

我曾想在我的主包的子目录中创建一个包,其中包含 header + lib,并使用相对路径,最后使用 swift build -Xlinker ./relative/path/to/mylib,但是我没有成功解决依赖关系,因为它应该是一个独立的 git 存储库。错误信息是:

错误:克隆失败;致命:存储库“/absolute/path/to/mylib”不存在

此外,我不清楚使用 -Xlinker 标志是否是正确的方法。

我不能使用带有纯 SwiftPM 方法的桥接 header ,并且在系统范围内安装我的库似乎有点过分而且不太便携。

有什么想法吗?

最佳答案

我已经在 this project 中做到了在github上。它取代了 pthread_once_t通过将其包装在 C 中并将其重新暴露给 swift。这是一个有趣的练习,可以绕过自 pthread_once_t 以来 Swift 试图限制你进入的内容。和 dispatch_once无法直接获得。

这是一个精简版 Package.swift文件:

// swift-tools-version:4.0

import PackageDescription

let package = Package(
name: "Once",
products: [
.library(
name: "Once",
targets: ["OnceC", "Once"]),
],
dependencies: [
],
targets: [
.target(
name: "OnceC",
dependencies: [],
path: "Sources/OnceC"),
.target(
name: "Once",
dependencies: ["OnceC"],
path: "Sources/Swift"),
.testTarget(
name: "OnceTests",
dependencies: ["Once"]),
]
)

您可以轻松地将产品库替换为可执行文件。主要部分是产品的目标需要包含构建所需的 C 和 Swift 目标。

然后在您的目标部分中,使 swift 目标将 C 目标列为依赖项。


您可以在 SwiftPM Usage.md 中了解有关 C 目标所需布局的更多信息 here

C 语言目标

C 语言目标类似于 Swift 目标,除了 C 语言库应包含一个名为 include 的目录持有公共(public)标题。

要允许 Swift 目标导入 C 语言目标,请添加一个目标 list 文件中的依赖项。 Swift 包管理器将为这些的每个 C 语言库目标自动生成模块映射3个案例:

  • 如果 include/Foo/Foo.h存在并且Foo是下的唯一目录然后包含目录 include/Foo/Foo.h成为伞头。

  • 如果 include/Foo.h存在并且include然后不包含其他子目录 include/Foo.h成为伞头。

  • 否则如果 include目录只包含头文件,没有其他子目录,它成为伞目录。

复杂情况include布局,自定义 module.modulemap可里面提供include . SwiftPM 无法生成会报错符合上述规则的模块映射。

对于可执行目标,只允许一个有效的 C 语言主文件,即它无效 main.cmain.cpp在同一个目标中。


唯一重要的事情是你实际如何做 #import在 C 代码中,一旦它被编译为兼容模块。如果您使用 import/Foo/Foo.h您需要使用的组织 #include <Foo/Foo.h>如果你这样做 import/Foo.h你可以使用 #import "Foo.h" .

关于c - Swift 包管理器 C-interop : Non-system libraries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49779543/

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