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

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文件还原,在逻辑上保持正确。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值