[ C++で開発 ] [ TAO CORBA実装 ]
ACE 5.5.x + TAO 1.5.x + CIAO 0.5.xを、Windows XP OS上にVisual C++ 7.1コンパイラでインストールしたときの記録。
Visual C++ 7.1は、Visual Studio .NET 2003に含まれるC++コンパイラです。
作業用ディレクトリに入手したソースコードのアーカイブを展開します。
作業ディレクトリとして仮にF:\tmpの下に展開します。
Cygwinのbashでの例
torutk$ cd /cygdrive/f/tmp tmp$ tar xvjf ACE+TAO.tar.bz2 : tmp$ ls -F ACE_wrappers/ tmp$
MPCツールを使ってVisual Studio .NET 2003用ソリューションファイルを生成し、これを用いてビルドします。MPCツールはPerlで記述されているので、Perlをインストールする必要があります。Windows OSの場合、Cygwinを使用するかActive Perlを使用するかの方法がメジャーです。どちらも無償で入手できます。
ACE_wrapers\ace\config.h というファイルを新規に作成します。
// -*- C++ -*- #ifndef ACE_CONFIG_H #define ACE_CONFIG_H #define ACE_HAS_IPV6 1 #include "ace/config-win32.h" #endif /* ACE_CONFIG_H */ |
VC++ 7.1の設定ファイル(ace/config-win32-msvc-7.h)のデフォルトで以下が定義されています。
ACE_HAS_STANDARD_CPP_LIBRARY 1 ACE_USES_STD_NAMESPACE_FOR STDCPP_LIB 1
IPv6については、ACEおよびTAOのソースコード中ではマクロ定義ACE_HAS_IPV6を使って制御しています。そこで、config.hでこのマクロ定義を有効にします。
また、後述するvc71.featuresにも、ipv6=1 の記述を追加する必要があります。IPv6に必要なライブラリのリンクが追加されます。
VC++の場合は不要です。
TAO/TAOACE.mwcからmpcツールを使って必要なVisual Studio用プロジェクトファイルを生成します。
SSLを有効にする場合、ACE_wrappers\bin\MakeProjectCreator\config\vc71.features ファイルのssl行を1に修正します。
IPv6を使用するときは、ipv6=1を追記します。
// vc71.features,v 1.2 2005/08/22 09:35:48 jwillemsen Exp ssl=1 qos=1 cidl=0 rwho=0 sctp=0 ipv6=1 |
VC++ 2005の場合は、ACE_wrappers\bin\MakeProjectCreator\config\vc8.features ファイルを修正します。
SSLを有効にする場合、OpenSSLをインストールしたディレクトリを、環境変数SSL_ROOTに設定します。コマンドプロンプトで設定します。OpenSSLのインストールについてはこちらを参照。
注意) Shining Light ProductionsのWindows版バイナリは、SSLのライブラリファイル名が標準とは異なるため、デフォルトのACE_TAOワークスペースの設定ではACEのSSLビルドが失敗します。
D:\work\ACE_wrappers> set SSL_ROOT=D:\lib\openssl D:\work\ACE_wrappers>
環境変数ACE_ROOTとTAO_ROOTを設定します。
D:\work\ACE_wrappers> set ACE_ROOT=D:\work\ACE_wrappers D:\work\ACE_wrappers> set TAO_ROOT=%ACE_ROOT%\TAO D:\work\ACE_wrappers>
注意) 環境変数の設定中にダブルクォーテーションが含まれるとPerlの処理で失敗します。(例:”D:\work\ACE_wrappers")
[Cygwin環境のPerlを使用する場合]CygwinへのPATHを通します。
D:\work\ACE_wrappers> PATH=%PATH%;C:\cygwin\bin D:\work\ACE_wrappers>
MPCツールでVC7.1用のプロジェクトファイルを生成します。
[Cygwin環境のPerlを使用する場合]bash上でperlを実行しないとエラーが発生します。
D:\work\ACE_wrappers> cd TAO D:\work\ACE_wrappers\TAO> bash TAO$ $ACE_ROOT/bin/mwc.pl -type vc71 TAO_ACE.mwc Generating 'vc71' output using TAO_ACE.mwc Skipping SSL_FOR_TAO (ssl_for_tao.mpc), it requires ace_for_tao. Skipping ACE_XtReactor (ace_xtreactor.mpc), it requires xt. Skipping ACE_TkReactor (ace_tkreactor.mpc), it requires tk. Skipping ACE_QtReactor (ace_qtreactor.mpc), it requires qt. Skipping ACE_FOR_TAO (ace_for_tao.mpc), it requires ace_for_tao. Skipping ACE_FlReactor (ace_flreactor.mpc), it requires fl. Skipping TAO_XtResource (XtResource.mpc), it requires xt. Skipping TAO_TkResource (TkResource.mpc), it requires tk. Skipping TAO_QtResource (QtResource.mpc), it requires qt. Skipping TAO_FlResource (FlResource.mpc), it requires fl. Skipping wxNamingViewer (wxNamingViewer.mpc), it requires wxWindows. Skipping NamingViewer (NamingViewer.mpc), it requires mfc. Skipping PSDL (PSDL.mpc), it requires dummy_label. Skipping PSDL_Datastore (PSDL.mpc), it requires dummy_label. Skipping PSDL_Parser (PSDL.mpc), it requires dummy_label. Skipping RTCosScheduling (RTCosScheduling.mpc), it requires dummy_label. Generation Time: 1m 5s TAO$ exit exit D:\work\ACE_wrappers\TAO>
VC7.1用プロジェクトファイル TAO_ACE.sln が生成されます。
VC++ 2005の場合は、-typeオプションでvc8を指定します。
なお、デフォルトで含まれているVC++用ソリューションファイル(*.sln)、プロジェクトファイル(*.vcproj)を削除しないと更新されないファイルがあるという問題が発生しました。他の環境でも発生するかは不明です。
VC++ 2005のときのプロジェクトファイル削除
D:\work\ACE_wrappers\> find . \( -name "*.sln" -o -name "*.vcproj" \) -exec rm {} \; : D:\work\ACE_wrappers>
Visual Studio統合環境を起動したときに、統合環境が環境変数ACE_ROOTやSSL_ROOTを参照できるためには、システムで環境変数を設定するか、環境変数を設定したコマンドプロンプトから統合環境を起動します。ここでは、コマンドプロンプトからVisualStudio統合環境を起動します。
D:\work\ACE_wrappers\TAO> "C:\Program Files\Microsoft Visual Studio .NET 2003\ Vc7\bin\vcvars32.bat" : D:\work\ACE_wrappers\TAO> devenv.exe D:\work\ACE_wrappers\TAO>
Visual Studio .NET 2003統合環境が起動するので、[ファイル]メニューの[ソリューションを開く]で、ACE_wrappers\TAO\TAO_ACE.slnファイルを開きます。
[ビルド]メニューの[バッチビルド]を選択し、バッチビルドダイアログで[すべて選択(S)]ボタンを押し、[ビルド]ボタンを押します。
ビルド結果生成されるバイナリの一覧はここ。
1.リンクエラー:_GetAdaptersAddresses@20が見つからない
TAO 1.5.3では解消。但し、vc71.featuresの記述にipv6=1を追記すること。
ACEコアのビルド時に、IPv6を有効にしてビルドしたときに発生しました。Windowsでは、このGetAdaptersAddresses関数は、iphlpapi.libで定義されるものなので、このiphlpapi.libをリンク時にリンクするよう指定します。
2.ビルドエラー: ACE_ROOT、TAO_ROOTが見つからない
Windows Vista 64bit上でVisual Studio .NET 2003を使ってビルドしたときに発生。環境変数を設定したコマンドプロンプト上からdevenv.exeを起動しても環境変数が読み取られていないようです。回避策としては、コントロールパネルのシステムで環境変数を設定します。
Cygwinのbashコマンド環境を使用します。
ACE+TAOを展開してビルドしたまま利用してもよいのですが、そのままでは大量のディスク(2.5GB以上)を食っているので、TAOを利用するのに必要なファイルだけを抜き出して別なディレクトリにインストールします。
インストール先のディレクトリ構成は、元のディレクトリ構成と同じにします。ディレクトリ構成を変更すると、TAOで提供されるMakefile群が利用できなくなるためです。
以下、D:\lib\taoディレクトリ下にインストールする場合です。
D:\lib\tao +--- bin 実行ファイル、DLLファイルを格納 +--- idls IDL定義ファイルを格納 +--- ace ACEヘッダファイル等を格納 +--- TAO TAOヘッダファイル等を格納 +--- lib リンク時に必要なライブラリファイルを格納
tmp$ mkdir d:/lib/tao tmp$ mkdir d:/lib/tao/TAO tmp$ mkdir d:/lib/tao/idls tmp$ mkdir d:/lib/tao/lib tmp$ mkdir d:/lib/tao/bin
ヘッダファイルのうち、Windows以外のプラットフォーム用config-*.hは不要なのでコピーしません。
*iと*inlは全てコピーします。
*.cppファイルは、ヘッダファイル内で#include指令で記述されているものだけが必要なので、これを引っ掛けてコピーします。判定にはCygwinのfind、grep、awk、cpioコマンドを使用しています。
*.cppが約400ファイルあるうち81ファイルがコピー対象となりました。
必要なファイルを選別してインストール
ACE_wrappers$ find ace \( -name "*.h" -o -name "*.inl" \) ! -name "config-[^w]*" -print | cpio -pmd d:/lib/tao/ 9504 blocks ACE_wrappers$ cp ace/config-all.h ace/config-lite.h ace/config-macros.h d:/lib/tao/ace/ ACE_wrappers$ find ace -name "*.h" | xargs grep "^[ ]*#[ ]*include" | grep ".cpp" | awk 'FS="\""{split($0, chank); gsub(/.*\//, "", chank[2]); print "find ace -name", chank[2],"| cpio -pmd d:/lib/tao/"}' > install.sh ACE_wrappers$ sh install.sh 85 blocks 2 blocks : ACE_wrappers$
ACE_wrappers$ mkdir d:/lib/tao/TAO ACE_wrappers$ cp -r include d:/lib/tao ACE_wrappers$ cp TAO/rules.tao.GNU d:/lib/tao/TAO/ ACE_wrappers$
ACE/TAOを利用するアプリケーションをビルドする際に、これらメイクファイル用定義ファイルを使用します。
*.hと*iと*inlは全てコピーします。
*.cppファイルは、ヘッダファイル内で#include指令で記述されているものだけが必要なので、これを引っ掛けてコピーします。判定にはUNIXのfind、grep、awkコマンドを使用していますがあまりきれいではありません。とりあえず、*.cppが4349ファイルあるうち180ファイルがコピー対象となりました。
*.hと*.iと*.inlはディレクトリ構成を維持してコピーします。
ACE_wrappers$ find TAO/tao TAO/orbsvcs \( -name "*.[hi]" -o -name "*.inl" \) -o \( -name "examples" -o -name "*tests" \) -prune | cpio -pmd d:/lib/tao 34309 blocks ACE_wrappers$
ヘッダファイル(*.h)中からインクルードしている*.cppファイルを検索し、ディレクトリ構成を維持してコピーします。
ACE_wrappers$ find TAO/tao TAO/orbsvcs -name "*.h" -o \( -name "*tests" -o -nam e examples \) -prune | xargs grep "^[ ]*#[ ]*include" | grep ".cpp" | awk 'FS=" \""{split($0, chank); gsub(/.*\//, "", chank[2]); print "find TAO -name", chank [2], "| cpio -pmd d:/lib/tao/"}'|sort|uniq > install.sh ACE_wrappers$ sh install.sh 3 blocks 6 blocks : ACE_wrappers$
ACE_wrappers$ mkdir d:/lib/tao/idls ACE_wrappers$ find TAO \( -name "*tests" -o -name "[eE]xamples" -o -name "Test" -o -name "docs" -o -name "CIAO" \) -prune -o -name "*idl" -print | cpio -pmd d:/lib/tao/idls/ 1390 blocks ACE_wrappers$
Windowsの共有ライブラリファイル(DLL)は、リンク時に必要なインポートライブラリファイル(*.lib)と実行時に必要なダイナミックリンクライブラリファイル(*.dll)に分かれています。リンク解決時に必要なファイルをコピーします。
ACE_wrappers$ find . -name "*.lib" -exec cp {} d:/lib/tao/lib/ \; ACE_wrappers$
Windowsの共有ライブラリファイル(DLL)は、ライブラリを使用するアプリケーションが起動したときに読み込まれます(黙示のリンクの場合)。その際、DLLファイルは環境変数PATHの中から検索されるので、DLLファイルは環境変数PATHで指定するディレクトリに配置します。
ACE_wrappers$ find . \( -name "*.dll" -o -name "*.exe" \) \ -exec cp {} d:/lib/tao/bin/ \; ACE_wrappers$
要件等)
ACE・TAOがどのバージョンかを示すファイルが1つあるので、これをコピーしておきます。
ACE_wrappers$ cp VERSION d:/lib/tao/ACE_VERSION ACE_wrappers$ cp TAO/VERSION d:/lib/tao/TAO_VERSION ACE_wrappers$
ACE_wrappers$ cp bin/m[pw]c.pl d:/lib/tao/bin/ ACE_wrappers$ cp -r MPC d:/lib/tao ACE_wrappers$ cp -r bin/MakeProjectCreator d:/lib/tao/bin/ ACE_wrappers$
bin/mpc.plとMPC/mpc.plは同じファイル名ながら内容が異なっています。ACE/TAOプロジェクト生成時は、bin/mpc.plを使用します。
CIAOをビルドするには、以下のC++ライブラリを別途入手し利用可能にする必要があります。どちらもバイナリが用意されているので、それを利用するのが簡単です。
Xerces-Cライブラリもバイナリが提供されているので、それを利用するのが簡単です。
CIDLコンパイラは、ACE+TAO+CIAOのバージョンアップに合わせてバイナリが公開されています。
Windows OS/VC++ 7.1用のバイナリが以下に用意されています。
cidlc-0.5.7.zip をダウンロードし解凍すると、cidlc.exeファイル1つだけ展開されます。このcidlc.exeを、後述の%CIAO_ROOT%\bin の中にコピーします。
CIDLコンパイラのソースはACE+TAO+CIAOの中に含まれています。CIDLコンパイラをソースからビルドする場合は、以下のC++ライブラリが必要となります。
(ソースからのビルド手順はいずれ記載予定)
Windows OS/VC++ 7.1用のバイナリが以下に用意されています。
xerces-vc71-rtti-2_6.zip をダウンロードし、解凍します。ここでは、D:\libの下に展開することとします。
d:\lib\xerces +--- include +--- lib
環境変数 CIAO_ROOT を設定します。
D:\work\ACE_wrappers> set CIAO_ROOT=%TAO_ROOT%\CIAO D:\work\ACE_wrappers>
環境変数 XERCESCROOT を設定します。
D:\work\ACE_wrappers> set XERCESCROOT=D:\lib\xerces D:\work\ACE_wrappers>
MPCツールでVC++ 7.1用のプロジェクトファイルを生成します。
[Cygwin環境のPerlを使用する場合]bash上でperlを実行しないとエラーが発生します。
D:\work\ACE_wrappers>cd %CIAO_ROOT% D:\work\ACE_wrappers\TAO\CIAO>perl %ACE_ROOT%\bin\mwc.pl -type vc71 CIAO_TAO.mwc Using .../ACE_wrappers/bin/MakeProjectCreator/config/MPC.cfg DDS_ROOT was used in the configuration file, but was not defined. Generating 'vc71' output using CIAO_TAO.mwc Skipping SSL_FOR_TAO (ssl_for_tao.mpc), it requires ace_for_tao. Skipping ACE_XtReactor (ace_xtreactor.mpc), it requires xt. Skipping ACE_TkReactor (ace_tkreactor.mpc), it requires tk. Skipping ACE_QtReactor (ace_qtreactor.mpc), it requires qt. Skipping ACE_FOR_TAO (ace_for_tao.mpc), it requires ace_for_tao. Skipping ACE_FlReactor (ace_flreactor.mpc), it requires fl. Skipping ZlibCompressor (ZlibCompressor.mpc), it requires zlib. Skipping TAO_XtResource (XtResource.mpc), it requires xt. Skipping TAO_TkResource (TkResource.mpc), it requires tk. Skipping TAO_QtResource (QtResource.mpc), it requires qt. Skipping TAO_FlResource (FlResource.mpc), it requires fl. Skipping RepositoryManager (RepositoryManager.mpc), it requires zlib. Skipping RT_CCM_XML_Generation (RT-CCM-Handlers.mpc), it requires xsc. Skipping XSC_XML_Generation (Config_Handlers.mpc), it requires xsc. Skipping CIAO_Events_XML_Generation (CIAO_Events_Handlers.mpc), it requires xsc. Skipping NavDisplayGUI_DnC_exec (NavDisplayGUI.mpc), it requires qt. Generation Time: 1m 25s D:\work\ACE_wrappers\TAO\CIAO>
VC7.1用プロジェクトファイル CIAO_TAO.sln が生成されます。
VC++ 7.1でCIAO_TAO.slnを読み込み、バッチビルドでビルドします。
(いずれ記載予定)
DDSのソースはACE+TAO+CIAOとは別途公開なので、まずDDSのソースを入手します。OCI社のWebサイトから最新のベータリリースを入手します。
DDS-0.11.tar.gz を%TAO_ROOT%の下に展開します。別なディレクトリでも構いませんが、その場合後述の環境変数DDS_ROOTを適切に設定してください。
%TAO_ROOT% +-- DDS +-- DDS_TAO.mwc +-- MPC/ +-- bin/ +-- dds/ +-- lib/
環境変数DDS_ROOTを設定します。
D:\work\ACE_wrappers> set DDS_ROOT=%TAO_ROOT%\DDS D:\work\ACE_wrappers>
MPCツールでVC++ 7.1用のプロジェクトファイルを生成します。
D:\work\ACE_wrappers\TAO\DDS>perl %ACE_ROOT%\bin\mwc.pl -type vc71 DDS.mwc Using .../ACE+TAO_VC71/ACE_wrappers/bin/MakeProjectCreator/config/MPC.cfg Generating 'vc71' output using DDS.mwc Generation Time: 22s D:\work\ACE_wrappers\TAO\DDS>
生成されたDDS.slnをVC++ 7.1で読み込み、バッチビルドを実行します。
以下、D:\lib\taoディレクトリ下にインストールする場合です。
D:\lib\tao +-- TAO +-- DDS +-- bin
DDS$ mkdir d:/lib/tao/TAO/DDS DDS$ mkdir d:/lib/tao/TAO/DDS/bin DDS$ cd bin bin$ cp DCPSInfoRepo.exe tcps_ts.pl d:/lib/tao/TAO/DDS/bin/ bin$ cp -r DCPS d:/lib/tao/TAO/DDS/bin/ bin$
DDS$ mkdir d:/lib/tao/TAO/DDS/lib DDS$ cp lib/*.lib d:/lib/tao/TAO/DDS/lib/ DDS$ cp lib/*.dll d:/lib/tao/TAO/DDS/bin/ DDS$
DDS$ find dds \( -name "*.idl" -o -name "*.h" -o -name "*.inl" \) -print | cpio -pmd d:/lib/tao/TAO/DDS 3517 blocks DDS$
DDS$ cp -r MPC d:/lib/tao/TAO/DDS/ DDS$
DDS$ cp VERSION d:/lib/tao/TAO/DDS/ DDS$ cp *html d:/lib/tao/TAO/DDS/ DDS$
DLLやツールの実行ファイルを呼び出すための環境変数PATH設定、TAOアプリケーションのビルド時に使用するインクルードファイル・ライブラリファイルの置き場所の指定が必要となります。
TAOを利用するアプリケーションでは、伝統的に環境変数ACE_ROOTおよびTAO_ROOTを使用します。また、DLLファイルを置いたディレクトリを環境変数PATHに追加する必要があります。そこで、これら環境変数を設定しておきます。
そこで、ACEおよびTAOをインストールしたディレクトリに合わせてこれらの環境変数を再設定します。
環境変数名 | 設定方法 | 設定内容 |
---|---|---|
ACE_ROOT | 新規 |
D:\lib\tao |
TAO_ROOT | 新規 |
%ACE_ROOT%\TAO |
CIAO_ROOT | 新規 |
%ACE_ROOT%\TAO\CIAO |
DDS_ROOT | 新規 |
%ACE_ROOT%\TAO\DDS |
PATH | 追加 |
%ACE_ROOT%\binを追加する %CIAO_ROOT%\binを追加する %DDS_ROOT%\binを追加する |
TAOを使用するアプリケーションを開発する場合、インクルードファイルのパスと追加ライブラリのパスにTAOのinclude、libを指定します。また、IDLコンパイラ等のツールをVisual C++内部から呼び出す場合のツール格納ディレクトリを指定します。
表示するディレクトリ | ディレクトリに追加する内容 | 備考 |
---|---|---|
実行可能ファイル |
D:\lib\tao\bin |
IDLコンパイラをVC++内部から呼び出す場合は、この設定は必須です。 |
インクルードファイル |
D:\lib\tao |
個々のプロジェクト毎にパスを記述するならば不要。 |
ライブラリファイル |
D:\lib\tao\lib |
個々のプロジェクト毎にパスを記述するならば不要。 |