Mac环境下Rails+Authlogic安装scrypt失败:i386架构匹配问题求助
解决Mac上Authlogic+scrypt安装的架构不匹配问题
为啥系统会把i386当成目标架构?
大概率是你的Ruby环境(比如用RVM、rbenv装的Ruby)是基于i386架构编译的,或者安装gem时的环境变量默认指定了i386。另外有些旧依赖包会默认尝试编译32位版本,而你的Mac不管是Intel x86_64还是Apple Silicon,都是64位系统,这就导致链接器找不到对应i386版本的libunwind.dylib,直接报错了。
方法1:直接绕过scrypt安装(推荐,毕竟你不需要用它)
既然你压根用不上scrypt加密,完全可以跳过这个依赖的安装:
- 先检查你的
Gemfile,如果里面直接写了gem 'scrypt',删掉这一行再跑bundle install就行。 - 如果是Authlogic间接带进来的scrypt,那就在用户模型里明确指定用其他加密算法(比如bcrypt),这样Authlogic就不会去加载scrypt的相关代码了:
打开app/models/user.rb,修改成这样:class User < ApplicationRecord acts_as_authentic do |config| # 指定用BCrypt加密,替换掉默认的scrypt config.crypto_provider = Authlogic::CryptoProviders::BCrypt # 要是你喜欢其他加密方式,比如Sha512也可以换成对应的 end end - 要是bundle还是死磕要装scrypt,那就强制跳过它的原生扩展编译:
或者直接在安装时排除scrypt相关的组(如果你在Gemfile里给它分组了):bundle config set build.scrypt --no-native bundle installbundle install --without scrypt
方法2:修复架构不匹配(如果你之后可能要用scrypt)
要是之后说不定会用到scrypt,那可以通过指定编译架构来解决链接错误:
- 安装gem前先设置环境变量,强制用x86_64架构编译:
ARCHFLAGS="-arch x86_64" bundle install - 如果你是Apple Silicon的Mac,可能需要用Rosetta打开终端(右键终端→获取信息→勾选“使用Rosetta打开”),再跑上面的命令,确保编译环境和
libunwind.dylib的架构匹配。 - 另外可以检查下
/usr/local/lib里的libunwind.dylib是不是64位版本,要是是旧的32位,用Homebrew重装一下:brew reinstall libunwind
内容的提问来源于stack exchange,提问作者timpone
相关产品推荐
相关产品推荐

