【问题标题】:How to build openssl for M1 and for Intel?如何为 M1 和 Intel 构建 openssl?
【发布时间】:2021-10-30 06:55:18
【问题描述】:

我有一个需要使用 Libcrypto 的项目 - 我有两个版本的 Libcrypto(libcrypto.a(来自 OpenSSL 1.1.1)为 ARM64 构建)和(lcrypto.a(来自 OpenSSL 1.0.2)为 Intel) .撇开拥有两个不同版本是否是好习惯的问题不谈,我可以说,如果我包含 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 进行组合。 cutecoder.org/programming/compile-open-ssl-apple-silicon(创建通用库)。本教程的某些部分已经由 openssl 团队实现。
  • 我很困惑为什么你的工件首先被称为lcrypto.a。直观地说,这似乎是错误的,因为编译器/链接器在使用 -lcrypto 时永远不会找到该文件。
  • @MarekH 如果我可以将您的答案标记为正确,我会的。那只是票。谢谢。
  • 这能回答你的问题吗? Build Multiarch OpenSSL on OS X

标签: macos openssl apple-silicon libcrypto


【解决方案1】:

使用命令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:如果您打算使用动态库,请使用 lipo 合并 dylib 文件并运行 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

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多