macos - 如何为 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但我一点也不聪明。我想我构建了一个胖二进制文件——但我认为我构建的胖二进制文件不适用于任何一种架构!
解决方案
使用命令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
推荐阅读
- c# - 如果索引相距更远,按索引访问数组元素是否需要更长的时间?
- html - 如何使 div 适合其内容的宽度而不导致它们换行,同时比父级更宽
- git - git“lfs”和“hooks”文件夹是否应该在 .git 文件夹之外?
- nativescript - nativescript 项目损坏的构建错误
- c# - 实体框架计数与字段过滤器真的很慢 - 大量
- c# - 从自定义树文件夹对话框中删除隐藏文件夹
- c# - 将C++的dll函数导出到c#
- python-3.x - TensorFlow: Removing nans in accumulated gradients
- r - How to set the order of word cloud in comparison.cloud function in r?
- php - 基于 API 调用的 Laravel 5.4 自定义用户身份验证