我正在尝试构建一个 Swift 包,它包含一个用 C 编写的胖静态库:libndi_advanced_ios.a 来自 NewTek's Apple Advanced NDI SDK .
我无法将预编译库(只有头文件和 .a 二进制包可用)链接到我的 Swift 包。我做了很多研究并尝试了不同的解决方案,但都没有奏效。这是一个快速列表:
xcodebuild -create-xcframework
返回错误 binaries with multiple platforms are not supported
(这个解决方案也在 Swift Forums 上讨论过);.linkedLibrary
在 targets
正如 SPM Documentation 上的建议(即 outdated )给出警告 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
的别名/符号链接(symbolic link), 而 NDI_iOS_lib
指向 /Library/NDI Advanced SDK for Apple/lib/iOS
.我总是在更改
Package.swift
后清理构建文件夹.2022 年 10 月 1 日更新 : libndi_advanced_ios.a 需要 libc++.tbd。这可以在 中的应用程序中轻松链接构建阶段 -> 将二进制文件与库链接 ,但我不知道如何在 Swift 包中链接。
最佳答案
二进制目标需要用 .binary_target
指定.见docs和示例 here .
包装在 .xcframework
中的静态库示例从文件命令看起来像这样:
$ file GoogleAppMeasurement.xcframework/ios-arm64_armv7/GoogleAppMeasurement.framework/GoogleAppMeasurement
GoogleAppMeasurement.xcframework/ios-arm64_armv7/GoogleAppMeasurement.framework/GoogleAppMeasurement: Mach-O universal binary with 2 architectures: [arm_v7:current ar archive] [arm64]
GoogleAppMeasurement.xcframework/ios-arm64_armv7/GoogleAppMeasurement.framework/GoogleAppMeasurement (for architecture armv7): current ar archive
GoogleAppMeasurement.xcframework/ios-arm64_armv7/GoogleAppMeasurement.framework/GoogleAppMeasurement (for architecture arm64): current ar archive
创建 .xcframework
的一种方法文件是使用 Firebase 的 ZipBuilder创建一个 .xcframework
使用 CocoaPods podspec 文件指定的静态库中的文件。
关于ios - 链接到 Swift 包中的胖静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70557329/