ios - 链接到 Swift 包中的胖静态库

标签 ios swift static-libraries swift-package-manager swift-package

我正在尝试构建一个 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 上讨论过);
  • 使用 .linkedLibrarytargets正如 SPM Documentation 上的建议(即 outdated )给出警告 system packages are deprecated; use system library targets instead ,我什至不记得它是否构建成功;
  • 使用不同的标志和设置(如 linkerSettings )没有成功。也许我只是错过了正确的组合。

  • 我可以链接几十个 Stackoverflow 的问题和其他没有帮助的帖子,但它没有用(abc)。
    目前我有这个配置:
    project structure with module.modulemap
    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 没有构建:
    errors and warnings
    我也试过.systemLibrary(name: "CiOSNDI", path: "Libraries/"),使用此配置:alessionossa/swift-ndi/tree/systemLibrary ;但我收到这些错误:
    errors and warnings 2
    注意 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/

    相关文章:

    ios - 将手势识别器添加到 UIImage,而不是 UIImageView

    ios - 将不同的数组合并到另一个数组中

    ios - 更改其他 View Controller Swift 的变量

    c++ - 如何将 opendnp3 添加为静态 C++ 库

    iOS:Xib 文件 Interface Builder 中的顶部布局指南在哪里?

    ios - CAAnimationGroup 与 CAKeyframeAnimation 和 CABasicAnimation

    ios - SKLabelNode 未出现在实际设备上

    ios - 如何在 Swift 中制作下拉菜单

    c++ - 有什么方法可以找出静态库是用 -fPIcflags编译的

    iphone - 无法在工作区的XCode 4中链接静态库