如何为M1和Intel架构构建OpenSSL,生成兼容双架构的Libcrypto胖二进制
方案1:基于现有两个库分别按架构链接
你不需要同时把两个库都加入全局链接列表,Xcode支持按架构条件绑定库,按以下操作即可:
- 打开项目的Build Phases页面,找到Link Binary With Libraries选项
- 先移除所有已添加的libcrypto.a、lcrypto.a条目
- 点击+号把两个库都添加到列表中
- 分别点击两个库条目右侧的「Required」下拉框,选择「Allow any platform or architecture」,之后新增过滤条件:
- 给ARM64架构的libcrypto.a添加过滤:Architecture = arm64
- 给x86_64架构的lcrypto.a添加过滤:Architecture = x86_64
- 编译时Xcode会自动根据当前构建的架构选择对应的库链接,不会触发架构缺失错误,也能正常构建胖二进制。
注意:由于你手上两个库版本(1.1.1和1.0.2)API存在差异,如果你的代码调用了两个版本不兼容的接口,必须用预编译宏按架构区分实现,否则会出现运行时崩溃,示例如下:
#if __arm64__ // 调用OpenSSL 1.1.1版本兼容的API #else // 调用OpenSSL 1.0.2版本兼容的API #endif
方案2:自行编译统一版本的双架构胖二进制库
如果不想维护两套代码逻辑,建议自己编译同一版本的OpenSSL生成双架构libcrypto.a,之前编译失败大概率是架构参数配置错误,按以下步骤操作即可:
- 下载对应版本的OpenSSL源码,优先选1.1.1系列稳定版,兼容性更好
- 分别编译ARM64和x86_64两个架构的静态库,编译时指定对应target:
- 编译x86_64版本的配置命令:
./Configure darwin64-x86_64-cc shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="自定义输出路径/x86_64" - 编译arm64版本的配置命令:
./Configure darwin64-arm64-cc shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="自定义输出路径/arm64"
- 编译x86_64版本的配置命令:
- 分别执行
make && make install得到两个架构下的libcrypto.a - 用lipo命令合并两个静态库为胖二进制:
lipo -create arm64路径/libcrypto.a x86_64路径/libcrypto.a -output 输出路径/libcrypto_fat.a - 验证合并结果:
lipo -info 输出路径/libcrypto_fat.a,输出会显示同时包含x86_64和arm64两个架构,直接将这个库加入项目链接即可。
内容的提问来源于stack exchange,提问作者headbanger
相关产品推荐
相关产品推荐

