M1芯片MacOS Monterey下Ruby3.0.2安装sqlite3 gem报错如何解决
问题原因
该报错是Ruby 3.0.2在Apple Silicon架构下的头文件宏定义特性与旧版本sqlite3 gem(1.4.2)的编译规则不兼容导致:Ruby 3.0+引入了__declspec相关的属性宏,而sqlite3 1.4.2的默认编译参数没有开启对应编译器特性,同时M1芯片Mac默认的Homebrew sqlite3路径不在gem的默认搜索路径中,双重原因触发编译失败。Ruby 2.7.4版本没有相关宏定义,所以可以正常安装。
修复步骤
前置准备
先通过Homebrew安装原生arm64架构的sqlite3依赖:
brew install sqlite3
方案1:安装兼容Ruby 3 + M1的新版本sqlite3 gem(推荐)
sqlite3 1.5.0及以上版本已经适配了Apple Silicon和Ruby 3.0+,直接指定编译参数安装即可:
gem install sqlite3 -- --with-sqlite3-dir=$(brew --prefix sqlite3)
如果需要指定版本,可执行:
gem install sqlite3 -v '1.5.3' -- --with-sqlite3-dir=$(brew --prefix sqlite3)
方案2:强制兼容安装sqlite3 1.4.2版本
如果业务需要必须使用1.4.2版本,额外添加编译器参数开启__declspec特性支持即可:
gem install sqlite3 -v '1.4.2' -- --with-cflags="-fdeclspec" --with-sqlite3-dir=$(brew --prefix sqlite3)
Bundler项目全局配置
如果是使用Bundler管理依赖的项目,可执行以下命令配置全局编译参数,后续执行bundle install时自动生效:
bundle config set build.sqlite3 --with-sqlite3-dir=$(brew --prefix sqlite3) --with-cflags="-fdeclspec"
验证
安装完成后执行以下命令验证安装成功:
ruby -r sqlite3 -e "puts SQLite3::VERSION"
正常输出版本号即表示安装成功。
内容的提问来源于stack exchange,提问作者Brian Morearty
相关产品推荐
相关产品推荐

