Ruby, gem install mysql2, -lmysqlclient が見つかりません

Rubymysql2 という gem をインストールするときに起きた問題について。

問題

検証環境:Amazon Linux AMI release 2014.09

Ruby, MySQL がインストールされた OS に対し、
mysql2 をインストールしようとすると、
「/usr/bin/ld: -lmysqlclient が見つかりません」と怒られる。

具体的には、次のような内容で Error が発生する。

# バージョン管理に RVM を利用してます
$ rvmsudo gem install mysql2
Fetching: mysql2-0.3.17.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing mysql2:
	ERROR: Failed to build gem native extension.

    /usr/local/rvm/rubies/ruby-2.0.0-p598/bin/ruby -r ./siteconf20150120-23376-eypaci.rb extconf.rb
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Setting libpath to /usr/lib64
-----
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling mysql2_ext.c
compiling result.c
result.c: In function ‘msec_char_to_uint’:
result.c:186:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (i = 0; i < (len - 1); i++) {
                 ^
compiling infile.c
compiling client.c
linking shared-object mysql2/mysql2.so
/usr/bin/ld: -lmysqlclient が見つかりません
collect2: error: ld returned 1 exit status
make: *** [mysql2.so] エラー 1

make failed, exit code 2

Gem files will remain installed in /usr/local/rvm/gems/ruby-2.0.0-p598/gems/mysql2-0.3.17 for inspection.
Results logged to /usr/local/rvm/gems/ruby-2.0.0-p598/extensions/x86_64-linux/2.0.0/mysql2-0.3.17/gem_make.out

原因

「/usr/bin/ld: -lmysqlclient が見つかりません」は、
mysql2 が「mysqlclient」という共有ライブラリを見つけることができなかったということ。

ldconfig を実行してみる。

$ ldconfig -p | grep mysqlclient
	libmysqlclient_r.so.16 (libc6,x86-64) => /usr/lib64/libmysqlclient_r.so.16
	libmysqlclient_r.so.15 (libc6,x86-64) => /usr/lib64/libmysqlclient_r.so.15
	libmysqlclient_r.so.14 (libc6,x86-64) => /usr/lib64/libmysqlclient_r.so.14
	libmysqlclient_r.so.12 (libc6,x86-64) => /usr/lib64/libmysqlclient_r.so.12
	libmysqlclient.so.16 (libc6,x86-64) => /usr/lib64/libmysqlclient.so.16
	libmysqlclient.so.15 (libc6,x86-64) => /usr/lib64/libmysqlclient.so.15
	libmysqlclient.so.14 (libc6,x86-64) => /usr/lib64/libmysqlclient.so.14
	libmysqlclient.so.12 (libc6,x86-64) => /usr/lib64/libmysqlclient.so.12

/usr/lib64 以下に、それっぽいものが入っているように見えるが、
これではダメらしい。



解決方法

私の場合、MySQL を次のようにインストールしていた。

# NG: このインストールには問題がある。
MYSQL_VERSION="5.5.41-1"
sudo yum -y localinstall http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/MySQL-shared-compat-${MYSQL_VERSION}.linux2.6.x86_64.rpm
sudo yum -y localinstall http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/MySQL-server-${MYSQL_VERSION}.linux2.6.x86_64.rpm
sudo yum -y localinstall http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/MySQL-client-${MYSQL_VERSION}.linux2.6.x86_64.rpm
sudo yum -y localinstall http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/MySQL-devel-${MYSQL_VERSION}.linux2.6.x86_64.rpm

この内容に不足があったようだ。
MySQL-shared」というものを一緒にインストールする必要がある。

具体的には、MySQL を次のようにインストールする。

# OK: 正しいインストール
MYSQL_VERSION="5.5.41-1"
sudo yum -y localinstall http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/MySQL-shared-compat-${MYSQL_VERSION}.linux2.6.x86_64.rpm
sudo yum -y localinstall http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/MySQL-shared-${MYSQL_VERSION}.linux2.6.x86_64.rpm
sudo yum -y localinstall http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/MySQL-server-${MYSQL_VERSION}.linux2.6.x86_64.rpm
sudo yum -y localinstall http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/MySQL-client-${MYSQL_VERSION}.linux2.6.x86_64.rpm
sudo yum -y localinstall http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/MySQL-devel-${MYSQL_VERSION}.linux2.6.x86_64.rpm

ldconfig してみると、
先程はなかった「/usr/lib64/libmysqlclient.so」が増えていることが確認できる。

$ ldconfig -p | grep mysqlclient
	libmysqlclient_r.so.16 (libc6,x86-64) => /usr/lib64/libmysqlclient_r.so.16
	libmysqlclient_r.so.15 (libc6,x86-64) => /usr/lib64/libmysqlclient_r.so.15
	libmysqlclient_r.so.14 (libc6,x86-64) => /usr/lib64/libmysqlclient_r.so.14
	libmysqlclient_r.so.12 (libc6,x86-64) => /usr/lib64/libmysqlclient_r.so.12
	libmysqlclient.so.18 (libc6,x86-64) => /usr/lib64/libmysqlclient.so.18
	libmysqlclient.so.16 (libc6,x86-64) => /usr/lib64/libmysqlclient.so.16
	libmysqlclient.so.15 (libc6,x86-64) => /usr/lib64/libmysqlclient.so.15
	libmysqlclient.so.14 (libc6,x86-64) => /usr/lib64/libmysqlclient.so.14
	libmysqlclient.so.12 (libc6,x86-64) => /usr/lib64/libmysqlclient.so.12
	libmysqlclient.so (libc6,x86-64) => /usr/lib64/libmysqlclient.so # ← これ

この状態で mysql2 をインストールすると、うまくいった。

$ rvmsudo gem install mysql2
Fetching: mysql2-0.3.17.gem (100%)
Building native extensions.  This could take a while...
Successfully installed mysql2-0.3.17
Parsing documentation for mysql2-0.3.17
unable to convert "\xF8" from ASCII-8BIT to UTF-8 for /usr/local/rvm/gems/ruby-2.0.0-p598/extensions/x86_64-linux/2.0.0/mysql2-0.3.17/mysql2/mysql2.so, skipping
unable to convert "\xF8" from ASCII-8BIT to UTF-8 for lib/mysql2/mysql2.so, skipping
Installing ri documentation for mysql2-0.3.17
1 gem installed