使用两个静态库(libssl.a、libcrypto.a)创建 XCFramework

Ric*_*hiy 9 openssl static-libraries ios libcrypto xcframework

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

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

我的目标是创建一个捆绑这两个静态库的 XCFramework,以便可以方便地将 Swift Package Manager 作为单个包使用。

我绝对可以使用以下命令从静态库创建一个支持多个平台的 XCFramework:iOS Simulator ( 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
Run Code Online (Sandbox Code Playgroud)

输出如下:

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
Run Code Online (Sandbox Code Playgroud)

标识符为“ios-arm64_i386_x86_64-simulator”的库已存在。

这是有道理的,因为 和 都libcrypto.a具有libssl.a相同的架构。

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

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

idz*_*idz 8

你基本上有两个选择:

  1. 创建两个单独的 XCFrameworks,一个用于libcrypto.a,一个用于libssl.a或者
  2. 比方说,将libcrypto.a和合并到一个库中,并使用这个组合库创建一个 XCFramework。libssl.alibOpenSSL.a

看来您知道该怎么做 (1)。那么对于(2)你需要做什么呢?

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

ar -x libcrypto.a
ar -x libssl.a
ar -cr libOpenSSL.a *.o
Run Code Online (Sandbox Code Playgroud)

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

更新: 用户 Steven0351 在评论中告诉我,有一种更优雅的方法可以ar使用以下命令实现与上述命令序列相同的结果libtool

libtool -static -o libOpenSSL.a libcrypto.a libssl.a
Run Code Online (Sandbox Code Playgroud)

需要注意的是...如果您一直在使用 GNU 工具,您需要确保您libtool运行的是 Xcode 工具链中的工具。所以你可能想在上面加上前缀xcrun.

  • 仅供参考,您也可以使用 libtool 执行相同的操作,而无需手动提取档案:`libtool -static -o outputname.a list.a of.a archives.a` (3认同)