解决ruby安装mysql的gem包native编译错误

博客指出mysql的gem包年久失修,ruby的dbi数据库操作依赖该包。安装dbd - mysql的gem包时,因新版ruby整形数值合并,原生代码引用不存在类型导致编译报错。给出三种解决方法,经分析第三种最简便且测试运行正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql的gem包年久失修,项目的作者明确表示不再维护该包的代码,等待接盘侠。然而习惯了使用ruby的dbi数据库操作,dbi的mysql驱动dbd-mysql依赖于mysql的gem包,因此还是绕不过去,只有硬着头皮把它改了。

错误的表现:

在安装dbd-mysql的gem包时,去解决依赖安装mysql的gem包,结果native代码编译报错,提示rb_cFixnum变量没有定义。

错误的原因:

在新版的ruby实现中,已经将几类整形数值合并了,原来的数值型Fixnum和Bignum合并到Integer中去了,不再区分对待,而有年份的gem原生代码并不知情,引用到了这些类型的原生定义。

解决的方法:

存在三种方法处理这一问题,第一种方法为将ruby回退到支持mysql的gem包的版本;第二种方法为下载mysql的gem包的源代码(托管在github,可以去搜),然后修改原生代码,去除对不存在类型的判断和访问,之后重新打包并本地安装;第三种方法为在安装mysql的gem包时,临时调整ruby.h的定义,将rb_cFixnum类型typedef为rb_cInteger(其实rb_cBignum也有同样的问题,只不过在原生代码中并没有对其进行引用),之后安装gem包编译mysql原生代码,安装成功后将ruby.h文件还原,在逻辑上保持正确。

通过以上的分析,就工作量而言,第三种是最简便的方法,测试后运行正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值