[ C++で開発 ] [ TAO CORBA実装 ]

TAO1.5.x Windows Visual C++ 7.1インストール記録

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++コンパイラです。

Visual C++ 2005 Express版 / Platform SDK for Windows Server 2003 SP1追記
ACE 5.5.7 + TAO 1.5.7のビルドが通っています。

ビルドの準備

ソースコードの展開

作業用ディレクトリに入手したソースコードのアーカイブを展開します。

作業ディレクトリとして仮に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を使用するかの方法がメジャーです。どちらも無償で入手できます。

ビルド実施記録

1. config.hの編集

ACE_wrapers\ace\config.h というファイルを新規に作成します。

ACE_wrappers\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を有効にする

IPv6については、ACEおよびTAOのソースコード中ではマクロ定義ACE_HAS_IPV6を使って制御しています。そこで、config.hでこのマクロ定義を有効にします。

また、後述するvc71.featuresにも、ipv6=1 の記述を追加する必要があります。IPv6に必要なライブラリのリンクが追加されます。

2. platform_macros.GNUの編集

VC++の場合は不要です。

3. コンパイル・リンク

ACEとTAOを一緒にビルドする場合の設定

TAO/TAOACE.mwcからmpcツールを使って必要なVisual Studio用プロジェクトファイルを生成します。

SSLを有効にする場合、ACE_wrappers\bin\MakeProjectCreator\config\vc71.features ファイルのssl行を1に修正します。

IPv6を使用するときは、ipv6=1を追記します。

ACE_wrappers\bin\MakeProjectCreator\config\vc71.featuresの記述
// 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を起動しても環境変数が読み取られていないようです。回避策としては、コントロールパネルのシステムで環境変数を設定します。

4. インストール

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

ヘッダファイル群のコピー(ACE)

ヘッダファイルのうち、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/TAOのメイクファイル類をコピーします

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を利用するアプリケーションをビルドする際に、これらメイクファイル用定義ファイルを使用します。

ヘッダファイル群のコピー(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$ 

IDLファイル群のコピー

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$ 

DLL、実行ファイルのコピー

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$  

MPCツールのコピー

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

CIAOをビルドするには、以下のC++ライブラリを別途入手し利用可能にする必要があります。どちらもバイナリが用意されているので、それを利用するのが簡単です。

Xerces-Cライブラリもバイナリが提供されているので、それを利用するのが簡単です。

ライブラリの入手と設定

CIDLコンパイラ

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++ライブラリが必要となります。

(ソースからのビルド手順はいずれ記載予定)

Xerces-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

ソースの入手とビルド

ソースの入手と展開

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$
DLL、ライブラリファイルのコピー
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$ 
IDL、ヘッダーファイルのコピー
DDS$ find dds \( -name "*.idl" -o -name "*.h" -o -name "*.inl" \) -print
 | cpio -pmd d:/lib/tao/TAO/DDS
3517 blocks
DDS$ 
MPC設定ファイルのコピー
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$ 

VC++環境設定

環境変数・ツールオプションの設定

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
個々のプロジェクト毎にパスを記述するならば不要。