如何为 M1 和英特尔构建 openssl?

How to build openssl for M1 and for Intel?

我有一个项目需要使用 Libcrypto - 我有两个版本的 Libcrypto(libcrypto.a(来自 OpenSSL 1.1.1)为 ARM64 构建)和(lcrypto.a(来自 OpenSSL 1.0 .2) 对于英特尔)。撇开拥有两个不同版本是否是好的做法的问题不谈,我可以说,如果我包含 libcrypto.a,那么我可以在 M1 上构建和 运行,并且它在 M1 上运行良好。如果我包含 lcrypto.a 那么我可以在 Intel 上构建 运行 并且它在 Intel 上运行良好。我不能做的是将它们都包含在内(链接器错误 - The linked library 'lcrypto.a' is missing one or more architectures required by this target: arm64.) - 如果我不能将它们都包含在内,那么我就无法构建胖二进制文件,而且我的应用程序也不是完全有用!

我的问题是如何将两者都包含在我的项目中 - 或者我在哪里可以获得(以及如何包含)Libcrypto 的胖版本?我看过这个 https://github.com/balthisar/openssl-xcframeworks/releases and this https://developer.apple.com/forums/thread/670631 但我 none 更聪明。我 认为 我构建了一个 Fat Binary - 但我认为我构建的 Fat Binary 不适用于任何一种架构!

使用命令lipo合并二进制文件

分别编译Intel和ARM版本(arm版本需要Xcode12)。

export MACOSX_DEPLOYMENT_TARGET=10.9
cp -r openssl-1.1.1o openssl-1.1.1o-arm64 
cp -r openssl-1.1.1o openssl-1.1.1o-x86_x64 

构建英特尔一半

cd openssl-1.1.1o-x86_x64 
./Configure darwin64-x86_64-cc shared
make

建造手臂的一半

export MACOSX_DEPLOYMENT_TARGET=10.15 /* arm64 only with Big Sur -> minimum might be 10.16 or 11.0 */)
cd ../openssl-1.1.1o-arm64 
./Configure enable-rc5 zlib darwin64-arm64-cc no-asm
make

创建通用二进制文件使用命令 lipo:

cd ..
mkdir openssl-mac
lipo -create openssl-1.1.1o-arm64/libcrypto.a openssl-1.1.1o-x86_x64/libcrypto.a -output openssl-mac/libcrypto.a
lipo -create openssl-1.1.1o-arm64/libssl.a openssl-1.1.1o-x86_x64/libssl.a -output openssl-mac/libssl.a

验证生成的二进制文件是否包含两种架构:

file libcrypto.a libssl.a
libcrypto.a: Mach-O universal binary with 2 architectures: [x86_64:current ar archive random library] [arm64]
libcrypto.a (for architecture x86_64):  current ar archive random library
libcrypto.a (for architecture arm64):   current ar archive random library
libssl.a: Mach-O universal binary with 2 architectures: [x86_64:current ar archive random library] [arm64]
libssl.a (for architecture x86_64):  current ar archive random library
libssl.a (for architecture arm64):   current ar archive random library

PS:如果您打算使用动态库合并 dylib 文件,使用 lipo 和 运行 instal_name_tool

cd openssl-mac
install_name_tool -id '@rpath/libcrypto.1.1.1.dylib' libcrypto.1.1.1.dylib
install_name_tool -id '@rpath/libssl.1.1.dylib' libssl.1.1.dylib
otool -D libssl.1.1.dylib /* to verify */

结果:

libssl.1.1.dylib:
@rpath/libssl.1.1.dylib