如何在不要求用户将C库安装到其中的情况下,如何使用Swift软件包管理器包含C代码(在我的情况下为单个.c
文件和头文件)?/usr/local/lib
我曾考虑在主程序包的子目录中创建一个程序包,该程序包包含标题+ lib,并使用相对路径,最后使用构建swift build -Xlinker ./relative/path/to/mylib
,但是我无法成功解决依赖项,因为它被认为是一个独立的git仓库。错误信息是:
error: failed to clone; fatal: repository '/absolute/path/to/mylib' does not exist
此外,我不清楚使用-Xlinker
标志是否正确。
我不能将桥接头文件与纯SwiftPM方法一起使用,并且在系统范围内安装我的库似乎是过分的,而且不是很容易移植。
有任何想法吗?
我已经在github上的这个项目中做到了。它pthread_once_t
通过将其包装在C中并快速重新暴露来进行替换。这样做是一项有趣的练习,可以解决Swift试图限制您使用的功能pthread_once_t
,但是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目标。
然后在目标部分中,使快速目标将C目标作为依赖项列出。
您可以在SwiftPM Usage.md了解所需的布局对于C目标位置
C语言目标与Swift目标相似,不同之处在于C语言库应包含一个名称include
为包含公共头文件的目录。
要允许Swift目标导入C语言目标,请在清单文件中添加目标依赖项。在以下三种情况下,Swift软件包管理器将自动为每个C语言库目标生成一个模块映射:
如果include/Foo/Foo.h
存在并且Foo
是包含目录下的唯一目录,则include/Foo/Foo.h
成为伞头。
如果include/Foo.h
存在并且不include
包含其他子目录,则include/Foo.h
成为伞形标头。
否则,如果include
目录仅包含头文件而没有其他子目录,则它将成为伞形目录。
如果include
布局复杂,module.modulemap
可以在内部提供自定义include
。如果SwiftPM无法通过上述规则生成模块映射,则会出错。
对于可执行目标,仅允许一个有效的C语言主文件,即main.c
,main.cpp
在同一目标中具有该文件无效。
唯一重要的另一件事是#import
,一旦将其编译为兼容模块,您将如何实际使用C代码。如果您使用的是import/Foo/Foo.h
组织机构#include <Foo/Foo.h>
,则import/Foo.h
可以使用#import "Foo.h"
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句