首页 > 解决方案 > 如何为 M1 和 Intel 构建 openssl?

问题描述

我有一个需要使用 Libcrypto 的项目 - 我有两个版本的 Libcrypto(为 ARM64 构建的 libcrypto.a(来自 OpenSSL 1.1.1))和(用于英特尔的 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和这个https://developer.apple.com/forums/thread/670631但我一点也不聪明。我我构建了一个胖二进制文件——但我认为我构建的胖二进制文件不适用于任何一种架构!

标签: macosopensslapple-siliconlibcrypto

解决方案


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

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

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

建立英特尔的一半

cd openssl-1.1.1l-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.1l-arm64 
./Configure enable-rc5 zlib darwin64-arm64-cc no-asm
make

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

mkdir openssl-mac
lipo -create openssl-1.1.1l-arm64/libcrypto.a openssl-1.1.1l-x86_x64/libcrypto.a -output openssl-mac/libcrypto.a

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

file libcrypto.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

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

推荐阅读