macOS Sonoma 14.2.1安装mysql2 gem遇rb_tainted_str_new2未声明错误求助
解决macOS Sonoma 14.2.1安装mysql2 0.5.3时的
rb_tainted_str_new2未声明错误 错误根源
mysql2 0.5.3是较旧版本,不兼容Ruby 3.0及以上版本——Ruby 3.0移除了rb_tainted_str_new2这类与taint标记相关的C API,而该版本的mysql2源码仍在调用这个已废弃的方法,导致编译时触发ISO C99的隐式函数声明错误。
可行解决办法
方案1:升级mysql2到兼容版本(推荐)
如果业务代码允许,直接安装mysql2 0.5.4及以上版本(该版本已修复Ruby 3.x兼容问题),同时保留解决zstd依赖的参数:
gem install mysql2 -v '0.5.4' --with-ldflags=-L$(brew --prefix zstd)/lib --with-opt-dir=$(brew --prefix openssl)
或直接安装最新稳定版:
gem install mysql2 --with-ldflags=-L$(brew --prefix zstd)/lib --with-opt-dir=$(brew --prefix openssl)
方案2:切换到Ruby 2.x版本
如果必须使用mysql2 0.5.3,可通过版本管理工具(如rbenv、rvm)切换到Ruby 2.7.x版本(Ruby 2.x系列仍保留rb_tainted_str_new2 API),再执行安装命令:
# 以rbenv为例 rbenv install 2.7.8 rbenv local 2.7.8 gem install mysql2 -v '0.5.3' --with-ldflags=-L$(brew --prefix zstd)/lib --with-opt-dir=$(brew --prefix openssl)
方案3:给mysql2 0.5.3打本地补丁
若无法切换Ruby版本,可手动修改mysql2源码替换废弃API,再本地编译安装:
- 下载并解压mysql2 0.5.3源码:
gem fetch mysql2 -v '0.5.3' gem unpack mysql2-0.5.3.gem cd mysql2-0.5.3
- 编辑
ext/mysql2/client.c文件,找到第178行的rb_tainted_str_new2,替换为rb_str_new_cstr:
// 原代码 rb_tainted_str_new2(mysql_error(mysql)) // 修改后 rb_str_new_cstr(mysql_error(mysql))
- 构建并安装本地修改后的gem:
gem build mysql2.gemspec gem install mysql2-0.5.3.gem --with-ldflags=-L$(brew --prefix zstd)/lib --with-opt-dir=$(brew --prefix openssl)
内容的提问来源于stack exchange,提问作者Dorian
相关产品推荐
相关产品推荐

