Mac M1环境下无法安装snappy_ext gem的问题求助
解决Mac M1上snappy_ext gem安装失败的问题
问题背景
- 环境:Mac M1 (arm64),重装Ruby和Homebrew后无法安装snappy_ext
- 尝试过的方案:多个Ruby版本(3.2.2、2.7.6、3.0.6)、多种版本管理工具(rvm、rbenv、chruby、frum、asdf)、链接不同openssl版本,均无效
- 核心报错:安装时链接阶段出现
ld: 45 duplicate symbols,该gem源码多年未更新
解决思路
1. 利用系统/Homebrew预安装的snappy库,跳过gem内部编译
这个方案避免gem重复编译snappy导致符号冲突:
- 先通过Homebrew安装snappy:
brew install snappy - 安装gem时指定系统snappy库路径:
gem install snappy_ext -- --with-snappy-dir=$(brew --prefix snappy) - 如果用Bundler,先配置构建参数再安装:
bundle config build.snappy_ext --with-snappy-dir=$(brew --prefix snappy) bundle install
2. 修复gem源码的符号重复问题
由于snappy_ext自带的snappy库和Ruby扩展部分重复编译了相同符号,可修改源码构建配置:
- 克隆该gem的源码仓库,进入仓库目录
- 进入
ext/snappy目录,修改configure脚本或Makefile.in,移除对snappy核心代码的编译步骤,改为链接外部snappy库 - 本地构建并安装gem:
gem build snappy_ext.gemspec gem install snappy_ext-0.1.2.gem
3. 用Rosetta 2切换到x86环境安装
通过模拟x86架构绕过arm64下的编译兼容问题:
- 右键终端图标,选择「使用Rosetta打开」
- 安装x86版本的Homebrew(默认会安装到
/usr/local) - 安装x86版本的Ruby(以asdf为例):
asdf install ruby 3.0.6 --configure-opts="--with-arch=x86_64" - 在这个终端环境下执行
gem install snappy_ext或bundle install
4. 替换为维护活跃的替代gem
snappy_ext多年未更新,可改用以下兼容M1的替代方案:
snappy:纯Ruby绑定,支持arm64ffi-snappy:基于FFI的绑定,无需编译原生扩展
内容的提问来源于stack exchange,提问作者stephenmurdoch
相关产品推荐
相关产品推荐

