Hatena::Groupocaml-nagoya

yoshihiro503の関数的日記

2012-05-24 (Thu)

CentOSでocamlからmysqlを扱う

| 16:59 | CentOSでocamlからmysqlを扱う - yoshihiro503の関数的日記 を含むブックマーク はてなブックマーク - CentOSでocamlからmysqlを扱う - yoshihiro503の関数的日記

CentOS-6では yummysql-develをインストールしても、libmysqlclient.a が得られないようだ。

libmysqlclient.aがあるかどうかはlocateコマンドで確かめることができる。

 $ locate libmysqlclient
/usr/lib/mysql/libmysqlclient.so
/usr/lib/mysql/libmysqlclient.so.16
/usr/lib/mysql/libmysqlclient.so.16.0.0
/usr/lib/mysql/libmysqlclient_r.so
/usr/lib/mysql/libmysqlclient_r.so.16
/usr/lib/mysql/libmysqlclient_r.so.16.0.0
 $ locate libmysqlclient.a
 $

OCamlからMysqlを使う場合ocaml-mysql(執筆時version 1.1.0)を通常使うが、ocaml-mysqlビルド時にlibmysqlclient.aがないとリンクがうまくされないという問題がある。これでは、ocaml-mysqlインストール自体はエラーなく出来るが、それを使ったプログラムコンパイルが失敗する。

例えば次のようなエラーメッセージが出てしまう。

/usr/local/lib/ocaml/site-lib/mysql/libmysql_stubs.a(mysql_stubs.o): In function `stmt_finalize':
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:805: undefined reference to `mysql_stmt_close'
/usr/local/lib/ocaml/site-lib/mysql/libmysql_stubs.a(mysql_stubs.o): In function `res_finalize':
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:350: undefined reference to `mysql_free_result'
/usr/local/lib/ocaml/site-lib/mysql/libmysql_stubs.a(mysql_stubs.o): In function `caml_mysql_stmt_status':
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:1080: undefined reference to `mysql_stmt_errno'
/usr/local/lib/ocaml/site-lib/mysql/libmysql_stubs.a(mysql_stubs.o): In function `caml_mysql_stmt_close':
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:859: undefined reference to `mysql_stmt_close'
/usr/local/lib/ocaml/site-lib/mysql/libmysql_stubs.a(mysql_stubs.o): In function `caml_mysql_stmt_insert_id':
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:1072: undefined reference to `mysql_stmt_insert_id'
/usr/local/lib/ocaml/site-lib/mysql/libmysql_stubs.a(mysql_stubs.o): In function `caml_mysql_stmt_affected':
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:1064: undefined reference to `mysql_stmt_affected_rows'
/usr/local/lib/ocaml/site-lib/mysql/libmysql_stubs.a(mysql_stubs.o): In function `caml_mysql_stmt_execute':
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:986: undefined reference to `mysql_stmt_param_count'
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:1000: undefined reference to `mysql_stmt_bind_param'
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:1008: undefined reference to `mysql_stmt_execute'
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:1018: undefined reference to `mysql_stmt_field_count'
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:1028: undefined reference to `mysql_stmt_bind_result'
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:1015: undefined reference to `mysql_stmt_error'
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:987: undefined reference to `mysql_stmt_param_count'
/usr/local/lib/ocaml/site-lib/mysql/libmysql_stubs.a(mysql_stubs.o): In function `db_fields':
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:605: undefined reference to `mysql_num_fields'
/usr/local/lib/ocaml/site-lib/mysql/libmysql_stubs.a(mysql_stubs.o): In function `db_proto_info':
/home/itp/archives/ocaml-mysql-1.1.0/mysql_stubs.c:636: undefined reference to `mysql_get_proto_info'
...

これを解決するためにはocaml-mysqlビルドするときの configure で環境変数のLDFLAGSを設定しておけばよい。

例えば上で調べたように libmysqlclient.so の場所が /usr/lib/mysql/ だった場合、次のように ocaml-mysqlインストールし直せばよい。

 $ cd ocaml-mysql-1.1.0
 $ env LDFLAGS='-L/usr/lib/mysql' ./configure
 $ make clean
 $ make all
 $ make opt
 # make uninstall
 # make install