技術的雑談-OCI社版TAO1.4のインストール
環境
- 使用OS:RedHat Enterprise Linux. Kernel 2.4.21-32.0.1.EL
目的
オープンソースのTAO(C++によるCORBA実装)をコンパイルし、使えるようにする。
TAOはACE(オープンソースのネットワークライブラリ?)の上で動く。
なのでTAOを使うにはACEをまずセットアップする必要がある。
ソースの入手
Object Computing Inc.で無料配布している。
TAOとACEが一塊になっているものを入手する。(OCIにはそれしかないが。)
元祖のOpen source版のTAOにはメモリーリークのバグがあり、連続使用には問題があるらしい。
(2005/10/26現在、ACE5.4a+TAO1.4a_p5が最新らしい。展開したソースの一番上のディレクトリにあるVERSIONファイルの上のほうに書いてあります。)
ACEのコンパイル
ソースの展開
tar xfz ACE+TAO-1.4a_with_latest_patches.tar.gz
でソースがカレントディレクトリに展開される。
展開は「ACE_wrapper」というディレクトリが作成され、そこに行われる。
環境変数の設定
今ソースを展開したディレクトリパスをACE_ROOTに設定する。
export ACE_ROOT=/tmp/ACE_wrapper
あと、LD_LIBRARY_PATHを設定する。
export LD_LIBRARY_PATH=/opt/ACE_wrappers/lib:$LD_LIBRARY_PATH
設定ファイルの作成
ACEのコンパイルのために、設定ファイルを2つ作る必要がある。
- $ACE_ROOT/ace/config.h
$ACE_ROOT/ace/にプラットフォームごとのテンプレートがあるので、それにシンボリックリンクを張る。
今回はLinuxなので、
ln -s $ACE_ROOT/ace/config-linux.h $ACE_ROOT/ace/config.h
でOK。
- $ACE_ROOT/include/makeinclude/platform_macros.GNU
これも$ACE_ROOT/include/makeinclude/にプラットフォームごとのテンプレートがあるので、それに対してシンボリックリンクを張る。
ln -s $ACE_ROOT/include/makeinclude/platform_linux.GNU $ACE_ROOT/include/makeinclude/platform_macros.GNU
cxxとかiccとかは多分Intel compiler用なんだろう。確認してないけど。
make実行
$ACE_ROOTからmakeを実行する。
結構快調に走っていたが、
make[2]: 入ります ディレクトリ `/opt/ACE_wrappers/apps/soreduce' make[3]: 入ります ディレクトリ `/opt/ACE_wrappers/apps/soreduce' GNUmakefile: /opt/ACE_wrappers/apps/soreduce/GNUmakefile.soreduce MAKEFLAGS=w g++ -W -Wall -Wpointer-arith -O3 -g -pipe -D_REENTRANT -DACE_HAS_AIO_CALLS -D_GNU_SOURCE -I/opt/ACE_wrappers -DACE_HAS_EXCEPTIONS -D__ACE_INLINE__ -I../.. -c -o .obj/Library.o Library.cpp Library.cpp: member function 内の `void Library::load_modules()': Library.cpp:247: 文法エラー が `->' トークンの前にあります Library.cpp:248: conversion from `ACE_CString ()(...)' to `const ACE_CString' is ambiguous /opt/ACE_wrappers/ace/String_Base.inl:89: candidates are: ACE_String_Base<CHAR>::ACE_String_Base(unsigned int, CHAR = 0, ACE_Allocator* = 0) [with CHAR = char] <near match> /opt/ACE_wrappers/ace/String_Base.inl:43: ACE_String_Base<CHAR>::ACE_String_Base(CHAR, ACE_Allocator* = 0) [with CHAR = char] <near match> Library.cpp:249: no match for `ACE_String_Base<char> + ACE_CString (&)(...)' operator /opt/ACE_wrappers/ace/Time_Value.inl:327: candidates are: ACE_Time_Value operator+(const ACE_Time_Value&, const ACE_Time_Value&) /opt/ACE_wrappers/ace/SString.inl:55: ACE_NS_WString operator+(const ACE_NS_WString&, const ACE_NS_WString&) make[3]: *** [.obj/Library.o] エラー 1 make[3]: 出ます ディレクトリ `/opt/ACE_wrappers/apps/soreduce' make[2]: *** [soreduce] エラー 2 make[2]: 出ます ディレクトリ `/opt/ACE_wrappers/apps/soreduce' make[1]: *** [all] エラー 2 make[1]: 出ます ディレクトリ `/opt/ACE_wrappers/apps' make: *** [all] エラー 2
なんて怒られて止まる。
で、問題の$ACE_ROOT/apps/soreduce/Library.cppを調べてみると、
247行目に
ACE_CString ent_name (ACE_TEXT_ALWAYS_CHAR (dent[i]->d_name));
なんてあるので、エイヤで、
ACE_CString ent_name = (ACE_TEXT_ALWAYS_CHAR (dent[i]->d_name));
と、直すと文句を言わなくなった。
(正常動作できるのかどうかは知らない。)
*2005年11月2日追記 soreduceというのはREADMEによると、shared libraryで、使われていないものを減らして ディスク容量を節約するツールのようです。 多分無くても困らないでしょう。 多分。
今度は最後までコンパイル完了。
gperfのコンパイル
「TAOを使うならgperfが必要だよ」なんて書いてあったので、
cd $ACE_ROOT/apps/gperf make
してみたら、もう何もやることは無いらしい。
……まあ、確認までということで。
ACEのテスト
ACEのテストキットがあるようなので試してみる。
cd $ACE_ROOT/tests make
結構時間がかかる。
正常終了するとディレクトリ上にrun_test.plというperl scriptができているので、
./run_test.pl
で実行する。(もちろんperlが必要だけど。)
今回は、
- test/Priority_Task_Test
- test/Proactor_Test
の2つがエラーでボロボロ。
でも、どうしていいのかわからないのでとりあえず無視。
まあ、他は動くようなので多分大丈夫でしょう。(いいかげん)
TAOのコンパイル
環境変数の設定
TAO_ROOT環境変数を設定します。
export TAO_ROOT=$ACE_ROOT/TAO
LD_LIBRARY_PATHは変更しないのでいいのか??
→しなくてよさそうです。なぜならTAOのlib*.soも$ACE_ROOT/libにあるので。(make時にinstallされる。)
GNUmakefileの作り直し
そのままではTAOに必要なACEXMLを作ってくれないらしいので、ソースツリー各所のGNUmakefileを作り直す必要があるらしいです。
cd $TAO_ROOT find . -name GNUmakefile -exec rm {} \; $ACE_ROOT/bin/mwc.pl TAOACE.mwc
これでOKらしい。
TAOコアのコンパイル
cd $TAO_ROOT make
で後は待つだけ。かなりかかります。
testsのコンパイル
今のところ、Makefileがボーランドmake用に書かれているらしくてGNUのmakesだと動かない。
やれやれ…。
無視。……ってか、コレが一番やりたかったんだよ!!!
と、思ったら、さっきやった、
cd $TAO_ROOT/tests find . -name GNUmakefile -exec rm {} \; $ACE_ROOT/bin/mwc.pl tests.mwc
で、makeが通るようになった!!!
すばらしぃ〜〜〜〜〜♪
でも、tests配下のテストを一括実行するスクリプトは無いらしい(-_-;
それぞれcdした後にrun_test.plというスクリプトがあるので、それを実行するべし。
このままでは$ACE_ROOT配下が約1.1GBもあるので、適宜*.cppとか*.oとかを削除して使いましょう。
追記・Windows+Cygwin32環境のOCI社版TAOのサポート
OCI社版TAOをcygwin環境でコンパイルかけても一向にうまくいかないので、OCI社のTAOのページを良く見てみたら、
サポートされているプラットフォームにcygwinがない!!!!
ソースコード見てみてもconfig-cygwin32.hとかがOCI社版はカレントの本家TAOのものよりも全然古い。
ACEのコンパイルの時点でmsghdr構造体とかのメンバーが足りないとか、イロイロOS周りで引っかかりまくるのでダメっぽい。
あきらめてVisualStudio VC++上でコンパイルするか本家TAO( http://www.cs.wustl.edu/~schmidt/TAO.html )をコンパイルしましょう…。
(OCI版TAOは./configureがちゃんと動かない。多分既に./configure済みのconfig-*.hを付けてるからかな?)
履歴
- 2005/10/26 -- 初版
- 2005/11/02 -- 修正:途中のコンパイルエラーに解説を追加
- 2008/07/17 -- 「追記・Windows+Cygwin32環境のOCI社版TAOのサポート」を追加
技術的雑談へ戻る