从两个静态库(libssl.a、libcrypto.a)创建 XCFramework
Create XCFramework out of two static libraries (libssl.a, libcrypto.a)
考虑 OpenSSL,该项目本身有两个产品:libssl.a
和 libcrypto.a
。
为了简单起见,让我们使用存储 in this repository 的预编译库并仅考虑 iphonesimulator
平台。
查看存储库时,每个平台,例如iphonesimulator
或 iphoneos
将为所有需要的架构提供一组静态库。
我的目标是创建一个将这两个静态库捆绑在一起的 XCFramework,以便将 Swift 包管理器作为单个包使用起来很方便。
我绝对可以创建一个支持多平台的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
输出结果如下:
xcframework successfully written out to:
/Users/name/OSSL_test/OpenSSL.xcframework
框架结构正确,同时包含headers和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
A library with the identifier "ios-arm64_i386_x86_64-simulator"
already exists.
这是有道理的,因为 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
中提取所有目标文件,最后一个命令创建新的组合静态库。
更新:
用户 Steven0351 在评论中告诉我,有一种更优雅的方法可以使用 libtool
:
实现与上述 ar
命令序列相同的结果
libtool -static -o libOpenSSL.a libcrypto.a libssl.a
提醒一句...如果您一直在使用 GNU 工具,您需要确保 libtool
您 运行 是 Xcode 工具链中的那个。所以你可能想在上面加上前缀 xcrun
.
考虑 OpenSSL,该项目本身有两个产品:libssl.a
和 libcrypto.a
。
为了简单起见,让我们使用存储 in this repository 的预编译库并仅考虑 iphonesimulator
平台。
查看存储库时,每个平台,例如iphonesimulator
或 iphoneos
将为所有需要的架构提供一组静态库。
我的目标是创建一个将这两个静态库捆绑在一起的 XCFramework,以便将 Swift 包管理器作为单个包使用起来很方便。
我绝对可以创建一个支持多平台的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
输出结果如下:
xcframework successfully written out to: /Users/name/OSSL_test/OpenSSL.xcframework
框架结构正确,同时包含headers和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
A library with the identifier "ios-arm64_i386_x86_64-simulator" already exists.
这是有道理的,因为 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
中提取所有目标文件,最后一个命令创建新的组合静态库。
更新:
用户 Steven0351 在评论中告诉我,有一种更优雅的方法可以使用 libtool
:
ar
命令序列相同的结果
libtool -static -o libOpenSSL.a libcrypto.a libssl.a
提醒一句...如果您一直在使用 GNU 工具,您需要确保 libtool
您 运行 是 Xcode 工具链中的那个。所以你可能想在上面加上前缀 xcrun
.