从两个静态库libssl.a、libcrypto.a创建 XCFramework

问题描述

考虑 OpenSSL,项目本身有两个产品:libssl.alibcrypto.a。 为简单起见,让我们使用存储 in this repository 的预编译库并仅考虑 iphonesimulator 平台。

查看存储库时,每个平台,例如iphonesimulatoriphoneos 将拥有一组用于所有所需架构的静态库。

我的目标是创建一个捆绑这两个静态库的 XCFramework,以便将 Swift 包管理器作为单个包使用。

我绝对可以创建一个支持多种平台的 XCFramework:iOS 模拟器(i386x86_64arm64)、iOS(arm64arm7.. .) 从静态库使用以下命令:

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 会被识别并用于构建应用程序。

但是,当我还尝试添加 libssl.a 时,出现以下错误

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.alibssl.a 的架构相同。

那么,我的问题是,是否可以使用单个 XCFramework 将两个静态库捆绑在一起?或者我应该创建两个单独的 XCFrameworks,以便每个库都有自己的?

在上面提到的存储库中,静态库实际上在另一个构建阶段用作输入,为每个平台生成一个 .framework。构建逻辑位于 OpenSSL.xcodeproj 中。所以,我想,我问的根本不可能?

解决方法

你基本上有两个选择:

  1. 创建两个单独的 XCFrameworks,一个用于 libcrypto.a,另一个用于 libssl.a
  2. libcrypto.alibssl.a 组合成一个库,比如 libOpenSSL.a,然后使用这个组合库创建一个 XCFramework。

看起来你知道怎么做(1)。那么你需要为 (2) 做什么?

您可以通过执行以下操作来创建组合的 libOpenSSL.a(为此最好将库复制到干净的 tmp 目录):

ar -x libcrypto.a
ar -x libssl.a
ar -cr libOpenSSL.a *.o

前两个命令从 libcrypto.alibssl.a 中提取所有目标文件,最后一个命令创建新的组合静态库。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...