動機
研究で急遽分散オブジェクト通信をする必要が出てきた上に,ちょうど過去にCORBAで作られたプログラムがあったのでそれを流用する形で行こうと思ったため.
方法
今回はMICO CORBAというライブラリを使ってCORBA環境を構築します.動作要件は下記の通り.
Cygwinでこれらのパッケージは追加してあるので要件は満たしています.次にMICO CORBAのサイトからソースをダウンロードしてビルドします.
# wget http://www.mico.org/mico-2.3.12.tar.gz # mv mico-2.3.12.tar.gz /usr/local # cd /usr/local # tar xzf mico-2.3.12.tar.gz # cd mico # ./configure # make ../include/mico/os-misc.h:286: error: declaration of C function `int gettimeofday(timeval*, timezone*)' conflicts with /usr/include/sys/time.h:73: error: previous declaration `int gettimeofday(timeval*, void*)' here
あら,エラーが出てしまった.どうしてだろう?とりあえず /usr/include/sys/time.h を見てみる.するとこんなコードを発見した.
struct timezone { int tz_minuteswest; int tz_dsttime; };
これって"tzcode: The time zone package"ってやつと関係あるのかな?それをUninstallしたいけど,coreutilsと依存関係があるしなぁ.とりあえず分からないんで./include/mico/os-misc.hの286行目にあるgettimeofday関数をコメントアウト.この部分ですね.
#ifdef __CYGWIN32__ extern "C" int gettimeofday (struct timeval *, struct timezone *); #endif
でもってもう一度makeする.
# make (略) make[1]: *** [libmicoir2.3.12.dll] Error 1
落ちやがった!今度は逆にさっきのコメントアウトを戻して,/usr/include/sys/time.hの73行目をコメントアウトする.この部分.
int _EXFUN(gettimeofday, (struct timeval *__p, void *__z));
これでもう一度makeしてみる.
# make make[1]: *** [libmicoir2.3.12.dll] Error 1
ダメだ!なんかやたらundefined reference to xxxが出て死んだ.落ち着け,俺.とりあえずここでREADMEを読んでないことに気が付く.(遅い)しかし根本的な解決方法は見つからず,普通にconfigure, make, make installをしろとしか書いていない.とりあえずFAQ見て環境変数を設定してみる.
export PATH=/usr/local/gcc/bin:$PATH export CXXFLAGS=-L/usr/local/gcc/lib export LD_LIBRARY_PATH=/usr/local/gcc/lib:$LD_LIBRARY_PATH
これでmake通らなかったらもうしらないや.…で,結果だめ,と.もう一度手順をおさらいしてみよう.今までは./configureをした後にmakeして,そこでファイルを書き換えていた.そこで今度はファイルを書き換えた後に./configureをしてみることにした.変更箇所は上と同様/usr/include/sys/time.h.
# ./configure # make # make install (略) make: ldconfig: Command not found make: [install] Error 127 (ignored)
このエラーは想定済みなので,これにてインストール完了!長かった….Macworld 2008の実況が無かったら確実に寝てた.
まとめ
やっぱりうまくいかない時はうまくいかない.でもだましだまし動かしてみると意外とうまくいく.