Ruby, gem install mysql2, -lmysqlclient が見つかりません
Ruby の mysql2 という 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