Ruby 3.2.1 + Rails 7.1.1中zxing Gem问题:未初始化扩展
解决Ruby 3.2.1 + Rails 7.1.1中zxing Gem导致的扩展未构建与Ruby版本不匹配问题
问题根源
你遇到的核心矛盾是:虽然rbenv versions显示当前用的是Ruby 3.2.1,但启动服务器时Bundler检测到的是JRuby 3.1.4。这说明zxing Gem(或其依赖)强制触发了JRuby环境,导致原本基于CRuby 3.2.1构建的Gem扩展(如bcrypt、bigdecimal)无法在JRuby下加载,进而抛出“extensions not built”错误。
分步解决方案
1. 彻底清理zxing相关环境
- 从Gemfile中移除
zxing,执行:bundle install - 清理zxing的Gem缓存:
gem cleanup zxing - 检查并卸载残留的JRuby相关Gem(如果有):
gem list | grep jruby gem uninstall [找到的JRuby相关Gem名]
2. 锁定当前环境为CRuby 3.2.1
- 确认本地项目的Ruby版本锁定:
rbenv local 3.2.1 - 重启终端,验证当前Ruby版本(确保不是JRuby):
ruby -v - 检查Bundler环境的Ruby版本是否一致:
bundle env
3. 重新安装兼容CRuby的zxing版本
- 查看zxing Gem的版本说明,选择支持Ruby 3.2.1的版本,在Gemfile中明确指定(示例):
gem 'zxing', '~> 0.2.3' - 强制重新构建所有Gem的扩展:
bundle install --force - 如果仍有个别Gem的扩展错误,手动重建:
bundle exec gem pristine bcrypt bigdecimal bootsnap
4. 安装zxing所需的系统依赖
zxing依赖系统级的条码识别库,需提前安装:
- Ubuntu/Debian:
sudo apt-get install libzbar0 libzbar-dev - macOS(Homebrew):
brew install zbar
zxing Gem与其他Gem错误的关联
zxing部分版本依赖JRuby环境,或其安装脚本会自动切换到JRuby执行。当Bundler加载zxing时,会强制使用JRuby 3.1.4(而非你指定的CRuby 3.2.1),导致所有依赖CRuby原生扩展的Gem(如bcrypt、bigdecimal)无法在JRuby环境中正常加载,因此批量抛出“extensions not built”错误。移除zxing后,Bundler回到CRuby环境,所有扩展恢复正常。
内容的提问来源于stack exchange,提问作者Andres Garzon
相关产品推荐
相关产品推荐

