ruby-trunkのコンパイルが1週間くらい出来なくて悶々としていたけど、昨日色々いじっていてようやく解決した。
コンパイルエラーになっていたのはdbm.soを作る所。そこで_gdbm_versionが見つからないと言われる。
さて、configureではちゃんとgdbm.libの_gdbm_versionを見つけられているのになんでだろうと思っていた。
結論は、ヘッダーの以下の記述が抜けていたのが問題だった。
#if defined(_WIN32) && !defined(GDBM_STATIC) # if defined(BUILDING_DLL) # define GDBM_EXTERN extern __declspec(dllexport) # else # define GDBM_EXTERN extern __declspec(dllimport) # endif #else # define GDBM_EXTERN extern #endif
これは、gdbm.dllを作るときのヘッダー gdbm.h にはあるけど、rubyのdbm.soを作るときにインクルードするヘッダ(ndbm.h)には含まれないもの。かと言って、両方インクルードするとdatumという構造体がgdbm.hにもndbm.hにも入っているのでエラーでこけてしまう。
というわけで、ndbm.hのtypeded struct {} datum; をコメントアウトして、そこに #include “gdbm.h” を入れたら無事コンパイルが通った。
なんともややこしい。