问题描述
考虑 OpenSSL,项目本身有两个产品:libssl.a
和 libcrypto.a
。
为简单起见,让我们使用存储 in this repository 的预编译库并仅考虑 iphonesimulator
平台。
查看存储库时,每个平台,例如iphonesimulator
或 iphoneos
将拥有一组用于所有所需架构的静态库。
我的目标是创建一个捆绑这两个静态库的 XCFramework,以便将 Swift 包管理器作为单个包使用。
我绝对可以创建一个支持多种平台的 XCFramework:iOS 模拟器(i386
、x86_64
、arm64
)、iOS(arm64
、arm7
.. .) 从静态库使用以下命令:
xcodebuild -create-xcframework \
-library iphonesimulator/lib/libcrypto.a \
-headers iphonesimulator/include/ \
-library iphoneos/lib/libcrypto.a \
-headers iphoneos/include/ \
-output OpenSSL.xcframework
输出如下:
xcframework 成功写出到: /Users/name/OSSL_test/OpenSSL.xcframework
框架的结构是正确的,它包含标头和 libcrypto.a
。当导入到另一个 Xcode 项目时,此 XCFramework 会被识别并用于构建应用程序。
xcodebuild -create-xcframework \
-library iphonesimulator/lib/libcrypto.a \
-headers iphonesimulator/include/ \
-library iphonesimulator/lib/libssl.a \
-headers iphonesimulator/include/ \
-output OpenSSL.xcframework
带有标识符“ios-arm64_i386_x86_64-simulator”的库 已经存在。
这是有道理的,因为 libcrypto.a
和 libssl.a
的架构相同。
那么,我的问题是,是否可以使用单个 XCFramework 将两个静态库捆绑在一起?或者我应该创建两个单独的 XCFrameworks,以便每个库都有自己的?
在上面提到的存储库中,静态库实际上在另一个构建阶段用作输入,为每个平台生成一个 .framework
。构建逻辑位于 OpenSSL.xcodeproj
中。所以,我想,我问的根本不可能?
解决方法
你基本上有两个选择:
- 创建两个单独的 XCFrameworks,一个用于
libcrypto.a
,另一个用于libssl.a
,或 - 将
libcrypto.a
和libssl.a
组合成一个库,比如libOpenSSL.a
,然后使用这个组合库创建一个 XCFramework。
看起来你知道怎么做(1)。那么你需要为 (2) 做什么?
您可以通过执行以下操作来创建组合的 libOpenSSL.a(为此最好将库复制到干净的 tmp 目录):
ar -x libcrypto.a
ar -x libssl.a
ar -cr libOpenSSL.a *.o
前两个命令从 libcrypto.a
和 libssl.a
中提取所有目标文件,最后一个命令创建新的组合静态库。