[Perl]DBD::mysqlをインストールして"mysql.so: undefined symbol: is_prefix "エラーが出た場合の対処法

DBD::mysqlをCPANからインストールしようとしたら、テストがこけました。
% cpanm DBD::mysql
---> Working on DBD::mysql
Fetching http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.020.tar.gz ... OK
Configuring DBD-mysql-4.020 ... OK
Building and testing DBD-mysql-4.020 ... FAIL
! Installing DBD::mysql failed. See /home/userhoge/.cpanm/build.log for details.
build.logを見ると、
Error: Can't load '/home/userhoge/.cpanm/work/1315125323.18422/DBD-mysql-4.020/blib/arch/auto/DBD/mysql/mysql.so'
 for module DBD::mysql: 
/home/userhoge/.cpanm/work/1315125323.18422/DBD-mysql-4.020/blib/arch/auto/DBD/mysql/mysql.so:
undefined symbol: is_prefix 
at /home/userhoge/perl5/perlbrew/perls/perl-5.14.1/lib/5.14.1/i686-linux/DynaLoader.pm line 190.

原因と解決方法

これはDBD::mysqlのバグだそうです。

DBD-mysql-4.020/mysql.xsファイルを開いて、下記の行を修正しましょう。

修正前
using_322=is_prefix(mysql_get_server_info(imp_dbh->pmysql),"3.22");

修正後
using_322 = ((strncmp(mysql_get_server_info(imp_dbh->pmysql),"3.22",4) == 0) ? 1 : 0 );
修正したら、コンパイル&テスト&インストールします。
$ cd /home/userhoge/.cpanm/work/1315125323.18422/DBD-mysql-4.020
$ make
$ make test
$ make install

参考

はてな人力検索で質問したらtokuhiromさんが教えてくれました。 感謝!

カテゴリ: