Swift Package Manager C-互操作:非系统库

山姆

如何在要求用户将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方法一起使用,并且在系统范围内安装我的库似乎是过分的,而且不是很容易移植。

有任何想法吗?

Bscothern

我已经在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语言目标

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.cmain.cpp在同一目标中具有该文件无效


唯一重要的另一件事是#import,一旦将其编译为兼容模块,如何实际使用C代码。如果您使用的是import/Foo/Foo.h组织机构#include <Foo/Foo.h>,则import/Foo.h可以使用#import "Foo.h"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Swift Package Manager的Swift IOS库无法编译

如何在 Swift Package Manager 中更改库的版本?

使用Swift Package Manager添加其他库

使用CocoaPods和Swift Package Manager设置库

Swift Package Manager无法解析

Swift Package Manager-Swift 4语法

如何使用Swift Package Manager的binaryTarget?

带有Multiplatform App的Swift Package Manager

从cocoapods过渡到Swift Package Manager

SwiftUI View和Swift Package Manager

Swift Package Manager混合语言源文件

Swift Package Manager:依赖项iOS版本

Swift Package Manager-UIKit依赖关系

提供配置文件给Swift Package Manager

iOS是否支持Swift Package Manager?

Swift Package Manager,添加本地依赖项

使用Swift Package Manager添加依赖项

Swift Package Manager-框架分发

使用现有的[iPhone App] XCode项目使用Swift Package Manager(SPM)(具有Swift和Objective C文件)

如何在Swift Package Manager中将本地库添加为依赖项

正在通过Swift Package Manager安装Stripe iOS SDK,但由于“未加载库”而崩溃

Swift Package Manager添加了自动第三方库确认和许可

存储库子目录中的Swift Package Manager依赖性

如何通过Swift Package Manager在Swift项目中添加Alamofire

Specify minimum macOS version for Swift Package Manager with Swift 5

如何使用Swift Package Manager确定Swift代码中的配置

使用Swift Package Manager时跨测试目标共享代码

使用Swift Package Manager在单元测试中使用资源

如何在Playground中使用Swift Package Manager