【发布时间】:2022-01-02 15:39:16
【问题描述】:
我正在尝试构建一个 Swift 包,其中包含一个用 C 编写的胖静态库:libndi_advanced_ios.a,来自NewTek's Apple Advanced NDI SDK。
我无法将预编译的库(只有头文件和 .a 二进制包可用)链接到我的 Swift 包。我做了很多研究并尝试了不同的解决方案,但都没有奏效。这是一个快速列表:
-
不能bundle in an XCFramework 因为libndi_advanced_ios.a 支持多个平台(arm_v7、i386、x86_64、arm64)并且
xcodebuild -create-xcframework返回错误binaries with multiple platforms are not supported(这个解决方案也在Swift Forums 上讨论过); -
按照SPM Documentation(即outdated)的建议在
targets中使用.linkedLibrary会发出警告system packages are deprecated; use system library targets instead,我什至不记得它是否构建成功; -
使用不同的标志和设置(如
linkerSettings)没有成功。也许我只是错过了正确的组合。
我可以链接几十个 Stackoverflow 的问题和其他没有帮助的帖子,但这将毫无用处(a、b、c)。
目前我有这个配置:
与 Package.swift 包含以下代码:
let package = Package(
name: "swift-ndi",
platforms: [.iOS(.v12)],
products: [
.library(
name: "swift-ndi",
targets: ["swift-ndi"])
],
dependencies: [],
targets: [
.target(name: "CiOSNDI", path: "Libraries"),
.target(
name: "swift-ndi",
dependencies: ["CiOSNDI"]),
.testTarget(
name: "swift-ndiTests",
dependencies: ["swift-ndi"]),
]
)
您可以在alessionossa/swift-ndi找到整个项目。
目前唯一的结果是一些警告和模块 CiOSNDI 没有构建:
我也试过.systemLibrary(name: "CiOSNDI", path: "Libraries/"),这个配置:alessionossa/swift-ndi/tree/systemLibrary;但我收到这些错误:
注意
NDI_include 实际上是/Library/NDI Advanced SDK for Apple/include 的别名/符号链接,而NDI_iOS_lib 指向/Library/NDI Advanced SDK for Apple/lib/iOS。
我总是在更改Package.swift 后清理构建文件夹。
2022 年 10 月 1 日更新:libndi_advanced_ios.a 需要 libc++.tbd。这可以在 Build Phases -> Link Binary With Libraries 中的应用中轻松链接,但我不知道如何在 Swift 包中链接。
【问题讨论】:
-
看起来您可以使用
linkerSettings目标参数链接到 Swift 包中。
标签: ios swift static-libraries swift-package-manager swift-package