我正在尝试迁移一个iOS应用程序来使用Swift包管理器,将框架转换为包。对于我的大多数代码来说,这并不是很简单,我有越来越多的模块和包可以很好地工作。
问题出在依赖于第三方库的模块上。"libA“库只能作为带有C头文件的二进制libA.a使用,并且我已经创建了一个xcframework,我使用binaryTarget通过Package.swift文件将其导入到模块"MyLibA”中。首先将该库转换为xcframework,如下所示:
lipo -extract arm64 -output libA_arm_ios/libA.a libA/bin/libA.a
lipo -extract x86_64 -output libA_x86_ios/libA.a libA/bin/libA.a
xcodebuild -create-xcframework -libA.a libA_arm_ios/libA.a -library \
libA_x86_ios/libA.a -headers libA/headers -output libA.xcframework
然后包含在swift包中,如下所示:
import PackageDescription
let package = Package(
name: "MyLibA",
products: [
.library(
name: "MyLibA",
targets: ["MyLibA"]),
],
dependencies: [
],
targets: [
.target(
name: "MyLibA",
dependencies: ["libA"]),
.binaryTarget(name: "libA", path: "build/libA.xcframework"),
.testTarget(
name: "MyLibATests",
dependencies: ["MyLibA"]),
]
)
然而,libA反过来依赖于zlib
,后者在苹果电脑上以libz.tbd的形式提供。因此,当我添加MyLibA依赖项并尝试运行MyLibATests时,我得到链接器错误
Undefined symbols for architecture arm64:
"_zlibVersion", referenced from:
_libA_method in libA.a(libA_la-version.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
所以问题是,我如何处理这个包中的zlib依赖关系?我是否需要找到/创建一个合适的.a,然后像对libA所做的那样将其包装在xcframework中?有没有更简单的解决方案?
发布于 2021-07-06 15:28:44
哇。太简单了。我已经走上了一条错误的道路,因为我读到了关于必须包装系统库等的内容,因为我一直在学习Swift Package Manager。
zlib是一个系统库,所以我需要做的就是添加
.linkedLibrary("z")
在目标的linkerSettings:
下:
targets: [
.target(
name: "MyLibA",
dependencies: ["libA"]),
linkerSettings: [
.linkedLibrary("z")
]
)
]
:facepalm:
https://stackoverflow.com/questions/68218103
复制