[ C++で開発 ]
The ADAPTIVE Communication Environment(略称:ACE)は、ソース公開されているオブジェクト指向ネットワークプログラミング用のC++フレームワークです。インストールにはソースからビルドすることになります。事前にビルド済みのバイナリは、ACEの商用サポートを行っている会社(Riverace)から購入することもできます。
ACEには、いくつかのコンポーネントが含まれています。全てのコンポーネントを必要とするわけではないので、必要なものをチョイスしてビルドすることになります。
コンポーネント名 | ディレクトリ | 内容 |
---|---|---|
ace | ACE_wrappers/ace | ACEのコアなので必須 |
QoS | ACE_wrappers/ace/QoS | ASE QoS API。Windows上ではMicrosoft GQOS APIを使用し、UNIX上ではRSVP APIを使用している。 |
SSL | ACE_wrappers/ace/SSL | SSLによるSocketを扱う。 |
RMCast | ACE_wrappers/protocols/ace/RMCast | 小規模な信頼性あるマルチキャストプロトコル |
TMCast | ACE_wrappers/protocols/ace/TMCast | トランザクション指向マルチキャストプロトコル |
HTBP | ACE_wrappers/protocols/ace/HTBP | 双方向HTTPトネリングプロトコル |
ACEXML | ACE_wrappers/ACEXML | XMLパーサ・フレームワーク(SAX2.0) |
ASNMP | ACE_wrappers/ASNMP | ACE+SNMP!(Another SNMP API) |
PACE | ACE_wrappers/PACE | POSIX ACE. 軽量化。POSIX.1様の下位インタフェースでCで記述している。 |
netsvcs | ACE_wrappers/netsvcs | 名前サービス、ロギングサービス、時刻サービス、排他サービスといったネットワークサービスを提供する |
websvcs | ACE_wrappers/websvcs | Webクライアント/サーバ構築に役立つクラス |
Gateway | ACE_wrappers/apps/Gateway | コネクション指向のアプリレベルで発信元もしくは宛先に基づくルーティングを行うGateway |
JAWS | ACE_wrappers/apps/JAWS | ACEで書かれた高性能HTTP Webサーバ |
JAWS2 | ACE_wrappers/apps/JAWS2 | |
JAWS3 | ACE_wrappers/apps/JAWS3 | |
FaCE | ACE_wrappers/apps/FaCE | PocketPC2002上のテスト・デバッグフレームワーク |
drwho | ACE_wrappers/apps/drwho | 分散RWHO |
gperf | ACE_wrappers/apps/gperf | IDLコンパイラ等が使用するGNU perfect hash function generator |
ACEのSSLコンポーネントをビルドするには、OpenSSLが別途必要です。
ACEをインストールする手順は大まか以下のようになります。
ACEは以下のWebサイトでソースコードが公開されています。
[Obtaining ACE]のリンクをたどると、各種アーカイブ形式のファイルがHTTP/FTPでダウンロードできるページになります。ACE単独のものと、ACE+TAO(TAOはACEを利用したCORBA実装)のものがあります。ACEだけインストールするなら前者、合わせてTAOもインストールするなら後者を入手します。
ACE自身もクロスプラットフォームなソースコードなので、サポートされるどのOSもすべてこの一つのソースからビルドされます。
作業用ディレクトリに1.で入手したソースコードのアーカイブを展開します。
Windows用にフリーのアーカイブツール(解凍ツール)がいくつもでていますが、TAR形式を正しく展開できるものは少ないようです(少なくても僕は知らない)。かなり深いディレクトリ構造のアーカイブの場合、エラーになったりあるいは正しく展開できないという問題があります。そこで、Windowsでアーカイブを展開するときは、ZIP形式のアーカイブを入手するか、GNU
tarツールのWindows版(例えばCygwin)を使用します。
ただ、ZIP形式はGZIPやBZIP2形式に比べて圧縮効率が悪いのでファイルサイズが大きくなるなります。
ACEフレームワークでは、実行するプラットフォームに関する情報をconfig.hに集約して扱います。これはACEのビルド時だけでなく、ACEライブラリ/フレームワークを使用する時にも必要です。そのOS・環境でどのような特性をサポートしているかを指定するシンボル定義の集まりです。
コンパイラのコマンド、オプション、ライブラリの位置などが記述されるファイルです。
ACEのソースをビルドします。
ACEをライブラリとしてプログラム開発で使用できるようにします。5.でコンパイル・リンクした際のディレクトリをそのまま使用してもいいですが、不要なファイルもたくさんあるので必要なファイルだけを抜き出します。
Windows上でACEをビルドするには、C++コンパイラが必要です。現在以下のコンパイラに対応しています。
あらかじめ、Visual C++用プロジェクトファイルがソースと一緒に配布されています。これを用いれば簡単にインストールすることができます。
上述のとおりACEのソースを入手します。
作業ディレクトリとして仮にF:\tmpの下に展開します。
torutk$ cd /cygdrive/f/tmp tmp$ tar xvjf ACE.tar.bz2 : tmp$ ls -F ACE_wrappers/ tmp$
ACE_wrapers\ace\config.h というファイルを新規に作成します。
// -*- C++ -*- #ifndef ACE_CONFIG_H #define ACE_CONFIG_H //#define ACE_HAS_WINNT4 0 //#define ACE_HAS_MFC 1 #define ACE_HAS_STANDARD_CPP_LIBRARY 1 //#define ACE_USES_STD_NAMESPACE_FOR_STDCPP_LIB 1 #define ACE_HAS_ANSI_CASTS 1 #include "ace/config-win32.h" #endif /* ACE_CONFIG_H */ |
ここで記述していないシンボル
VC++の場合は不要です。
VC++で次のワークスペースファイルを開きます。
ACE_wrappers\ace\ace.dsw
このワークスペースファイルには、以下のプロジェクト構成が含まれています。
プロジェクト名 | 設定名 | 内容 |
---|---|---|
ACE DLL | Win32 MFC Release | MFC対応用ACE DLL。ACE内部でのスレッド生成にCWinThreadを使用する。 |
Win32 MFC Debug | ||
Win32 Release | ||
Win32 Debug | ||
ACE LIB | Win32 Pharlap ETS Static Release | 旧Phar Lap社のWin32ハードリアルタイムOS用 (ETS:Embedded ToolSuit) |
Win32 Pharlap ETS Static Debug | ||
Win32 Static Release | ||
Win32 Static Debug |
Windows用としては、上記設定のうちPharlap ETSを除いた6つをビルドします。
3.のconfig.hの編集で、ACE_HAS_ANSI_CASTSを有効にした場合、プロジェクト設定に追加を行います。[プロジェクト]メニューから[設定]を選ぶと、プロジェクトの設定ダイアログが表示されます。設定の対象欄で[すべての構成]を選び、ACE DLLとACE LIBの両方を選択状態にします。次に右側のC/C++タブを選び、カテゴリ欄を[C++言語]に指定し、[ランタイムタイプ情報(RTTI)を有効にする]をチェックします。
ビルドを開始します。[ビルド]メニューから[バッチビルド]を選択し、Pharlap ETS用を除いた6つの設定を選択した状態で[ビルド]を実行します。
ビルドにかかった時間は、Pentium III 500MHzのPCで1時間強です。
Athlon 2500+(実クロック1.8GHz)のPCでは14分です。
設定名 | 静的/動的ライブラリファイル | インポートライブラリファイル |
---|---|---|
Win32 MFC Release | ACE_wrappers\bin\acemfc.dll | ACE_wrappers\ace\acemfc.lib |
Win32 MFC Debug | ACE_wrappers\bin\acemfcd.dll | ACE_wrappers\ace\acemfcd.lib |
Win32 Release | ACE_wrappers\bin\ace.dll | ACE_wrappers\ace\ace.lib |
Win32 Debug | ACE_wrappers\bin\aced.dll | ACE_wrappers\ace\aced.lib |
Win32 Static Release | ACE_wrappers\ace\aces.lib | − |
Win32 Static Debug | ACE_wrappers\ace\acesd.lib | − |
TAOのIDLコンパイラなどでgperfコマンドを使用します。なお、Cygwinに含まれるgperfではコマンドラインオプション等の違いでうまく利用できません。(環境変数PATHにCygwinの実行ファイルが含まれているとCygwinのgperfが呼び出されます。環境変数PATHから除いておくか、VC++の実行可能ディレクトリリストから削除します。)
VC++で次のワークスペースファイルを開きます。
ACE_wrappers\apps\gperf\src\gperf.dsw
このワークスペースファイルには、以下のプロジェクト構成が含まれています。コマンドとして呼び出すので、設定が簡単なスタティックリンクを使用します。デバッグビルドは不要なのでリリースビルド(Win32 Static Release)だけ構築します。
3.のconfig.hの編集で、ACE_HAS_ANSI_CASTSを有効にした場合、プロジェクト設定でRTTIを有効にします。
プロジェクト名 | 設定名 | 内容 |
---|---|---|
gperf | Win32 Release | |
Win32 Debug | ||
Win32 Static Release | ||
Win32 Static Debug |
Win32 Static Releaseのビルドが成功すると、以下のファイルが生成されます。
ACE_wrappers\bin\Release\gperf.exe
QoS機能が使用できるようになります。
VC++で次のワークスペースファイルを開きます。
ACE_wrappers\ace\QoS\ACE_QoS.dsw
このワークスペースファイルには、以下のプロジェクト構成が含まれています。
プロジェクト名 | 設定名 | 内容 |
---|---|---|
ACE_QoS DLL | Win32 Release | |
Win32 Debug | ||
ACE_QoS LIB | Win32 Static Release | |
Win32 Static Debug |
ビルドが成功すると、以下のファイルが生成されます。
設定名 | 静的/動的ライブラリファイル | インポートライブラリファイル |
---|---|---|
Win32 Release | ACE_wrappers\bin\ACE_QoS.dll | ACE_wrappers\ace\QoS\ACE_QoS.lib |
Win32 Debug | ACE_wrappers\bin\ACE_QoSd.dll | ACE_wrappers\ace\QoS\ACE_QoSd.lib |
Win32 Static Release | ACE_wrappers\ace\QoS\ACE_QoSs.lib | − |
Win32 Static Debug | ACE_wrappers\ace\QoS\ACE_QoSsd.lib | − |
リアルタイム・マルチキャスト通信が使用できるようになります。
VC++で次のワークスペースファイルを開きます。
ACE_wrappers\ace\RMCast\RMCast.dsw
このワークスペースファイルには、以下のプロジェクト構成が含まれています。
プロジェクト名 | 設定名 | 内容 |
---|---|---|
RMCast | Win32 Release | |
Win32 Debug |
ビルドが成功すると、以下のファイルが生成されます。
設定名 | 静的/動的ライブラリファイル | インポートライブラリファイル |
---|---|---|
Win32 Release | ACE_wrappers\bin\ACE_RMCast.dll | ACE_wrappers\ace\RMCast\ACE_RMCast.lib |
Win32 Debug | ACE_wrappers\bin\ACE_RMCastd.dll | ACE_wrappers\ace\RMCast\ACE_RMCastd.lib |
SSLを使った通信ができるようになります。SSLにはACEとは別途OpenSSLが必要になります。OpenSSLのインストールを参照ください。VC++でビルド済みのバイナリも置いています。インストールページにリンクがあります。
OpenSSLのインクルード・ライブラリファイルをVC++から参照できるように、以下の設定を行います。
設定項目 | 設定個所 | 追加内容 |
---|---|---|
インクルードファイルのパス | [ツール]→[オプション]→[ディレクトリ]タブ→インクルードファイル | d:\lib\openssl\include |
ライブラリのパス | [ツール]→[オプション]→[ディレクトリ]タブ→ライブラリファイル | d:\lib\openssl\lib |
VC++で次のワークスペースファイルを開きます。
ACE_wrappers\ace\SSL\ACE_SSL_LIB.dsw
このワークスペースファイルには、以下のプロジェクト構成が含まれています。
プロジェクト名 | 設定名 | 内容 |
---|---|---|
ACE_SSL | Win32 Release | ACE_SSLのDLL構築プロジェクト |
Win32 Debug | ||
ACE_SSL_LIB | Win32 Release | ACE_SSLのスタティックリンクライブラリ構築プロジェクト |
Win32 Debug |
ビルドが成功すると、以下のファイルが生成されます。
設定名 | 静的/動的ライブラリファイル | インポートライブラリファイル |
---|---|---|
Win32 Release | ACE_wrappers\bin\ACE_SSL.dll | ACE_wrappers\ace\SSL\ACE_SSL.lib |
Win32 Debug | ACE_wrappers\bin\ACE_SSLd.dll | ACE_wrappers\ace\SSL\ACE_SSLd.lib |
Win32 (Static) Release | ACE_wrappers\ace\SSL\ACE_SSLs.lib | − |
Win32 (Static) Debug | ACE_wrappers\ace\QoS\ACE_SSLsd.lib | − |
分散環境で名前サービス、時刻サービス、ロギングサービス、排他サービスなどを提供する部品です。
VC++で次のワークスペースファイルを開きます。
ACE_wrappers\netsvcs\lib\netsvcs.dsw
このワークスペースファイルには、以下のプロジェクト構成が含まれています。
プロジェクト名 | 設定名 | 内容 |
---|---|---|
NETSVCS Library | Win32 Release | |
Win32 Debug |
ビルドが成功すると、以下のファイルが生成されます。
設定名 | 静的/動的ライブラリファイル | インポートライブラリファイル |
---|---|---|
Win32 Release | ACE_wrappers\bin\netsvcs.dll | ACE_wrappers\netsvcs\netsvcst.lib |
Win32 Debug | ACE_wrappers\bin\netsvcsd.dll | ACE_wrappers\netsvcs\netsvcsd.lib |
netsvcsライブラリを使用したサーバやクライアントの実装例が提供されています。プログラミング方法についてはこれらを見るとよいでしょう。
プロジェクト名 | 場所 | 内容 |
---|---|---|
NETSVCS Direct Logging Client |
ACE_wrappers\netsvcs\clients\Logger\Logger.dsw | ロギングサービスを利用するクライアントのテストプログラム。クライアントが直接ロギングサービスと通信する場合を例示。 |
NETSVCS Indirect Logging Client |
ロギングサービスを利用するクライアントのテストプログラム。クライアント側にロギングデーモンを置き、デーモンがロギングサービスへ転送する場合を例示。 | |
NETSVCS Naming Client DLL |
ACE_wrappers\netsvcs\clients\Naming\Client\Client.dsw | |
NETSVCS Naming Client Test |
||
NETSVCS Servers | ACE_wrappers\netsvcs\servers\servers.dsw | |
NETSVCS Token Collection Client |
ACE_wrappers\netsvcs\clients\Tokens\collection\collection.dsw | |
NETSVCS Token Deadlock Client |
ACE_wrappers\netsvcs\clients\Tokens\deadlock\deadlock.dsw | |
NETSVCS Token Invariant Client |
ACE_wrappers\netsvcs\clients\Tokens\invariant\invariant.dsw | |
NETSVCS Token Manual Client |
ACE_wrappers\netsvcs\clients\Tokens\manual\manual.dsw | |
NETSVCS Token Mutex Client |
ACE_wrappers\netsvcs\clients\Tokens\mutex\mutex.dsw | |
NETSVCS Token RW_Lock Client |
ACE_wrappers\netsvcs\clients\Tokens\rw_lock\rw_lock.dsw |
サンプルをビルドすると、以下のファイルが生成されます。
プロジェクト名 | 設定名 | 内容 |
---|---|---|
NETSVCS Direct Logging Client |
Win32 Release | ACE_wrappers\netsvcs\clients\Logger\Release\direct_logging.exe |
Win32 Debug | ACE_wrappers\netsvcs\clients\Logger\direct_logging.exe | |
NETSVCS Indirect Logging Client |
Win32 Release | ACE_wrappers\netsvcs\clients\Logger\Release\indirect_logging.exe |
Win32 Debug | ACE_wrappers\netsvcs\clients\Logger\indirect_logging.exe | |
NETSVCS Naming Client DLL |
Win32 Release | [DLL]ACE_wrappers\bin\Client_Test.dll [インポート]ACE_wrappers\ace\netsvcs\clients\Naming\ClientClient_Test.lib |
Win32 Debug | [DLL]ACE_wrappers\bin\Client_Testd.dll [インポート]ACE_wrappers\ace\netsvcs\clients\Naming\ClientClient_Testd.lib |
|
NETSVCS Naming Client Test |
Win32 Release | ACE_wrappers\netsvcs\clients\Naming\Client\Release\main.exe |
Win32 Debug | ACE_wrappers\netsvcs\clients\Naming\Client\main.exe | |
NETSVCS Servers | Win32 Release | ACE_wrappers\netsvcs\servers\Release\main.exe |
Win32 Debug | ACE_wrappers\netsvcs\servers\main.exe | |
NETSVCS Token Collection Client |
Win32 Release | ACE_wrappers\netsvcs\clients\Tokens\collection\Release\collection.exe |
Win32 Debug | ACE_wrappers\netsvcs\clients\Tokens\collection\collection.exe | |
NETSVCS Token Deadlock Client |
Win32 Release | ACE_wrappers\netsvcs\clients\Tokens\deadlock\Release\deadlock.exe |
Win32 Debug | ACE_wrappers\netsvcs\clients\Tokens\deadlock\deadlock.exe | |
NETSVCS Token Invariant Client |
Win32 Release | ACE_wrappers\netsvcs\clients\Tokens\invariant\Release\invariant.exe |
Win32 Debug | ACE_wrappers\netsvcs\clients\Tokens\invariant\invariant.exe | |
NETSVCS Token Manual Client |
Win32 Release | ACE_wrappers\netsvcs\clients\Tokens\manual\Release\manual.exe |
Win32 Debug | ACE_wrappers\netsvcs\clients\Tokens\manual\manual.exe | |
NETSVCS Token Mutex Client |
Win32 Release | ACE_wrappers\netsvcs\clients\Tokens\mutex\Release\mutex.exe |
Win32 Debug | ACE_wrappers\netsvcs\clients\Tokens\mutex\mutex.exe | |
NETSVCS Token RW_Lock Client |
Win32 Release | ACE_wrappers\netsvcs\clients\Tokens\rw_lock\Release\rw_lock.exe |
Win32 Debug | ACE_wrappers\netsvcs\clients\Tokens\rw_lock\rw_lock.exe |
ACEを展開してビルドしたまま利用してもよいのですが、そのままでは500MB位ディスクを食っているので、ACEを利用するのに必要なファイルだけを抜き出して別なディレクトリにインストールします。
以下、D:\lib\aceディレクトリ下にインストールする場合です。
D:\lib\ace +--- bin 実行ファイル、DLLファイルを格納 +--- include ヘッダファイル等を格納 | +--- ace ACEのヘッダファイルを格納 | +--- netsvcs netsvcsヘッダファイルを格納 +--- lib リンク時に必要なライブラリファイルを格納
ACE_wrappers\aceの中にあるヘッダファイル(*.h)をコピーします。なお、ヘッダファイルの中でインクルードされているファイルが幾種類かあります。例えば、*.i、*.inl、*.cppなどです。これらも一緒にコピーする必要があります。安直な方法は、拡張子*.i、*.inl、*.cppを全てインストール先にコピーします。
安直なコピーによるインストール
tmp$ cd ACE_wrappers/ace ace$ cp *.h /cygdrive/d/lib/ace/include/ace/ ace$ cp *.i /cygdrive/d/lib/ace/include/ace/ ace$ cp *.inl /cygdrive/d/lib/ace/include/ace/ ace$ cp *.cpp /cygdrive/d/lib/ace/include/ace/ ace$
これでは不要なファイル(特に*.cppファイル)もコピーされてしまいます。そこで必要なファイルだけをコピーする方法を考えます。
ヘッダファイルのうち、Windows以外のプラットフォーム用config-*.hは不要なのでコピーしません。
*iと*inlは全てコピーします。
*.cppファイルは、ヘッダファイル内で#include指令で記述されているものだけが必要なので、これを引っ掛けてコピーします。判定にはUNIXのfind、grep、awkコマンドを使用していますがあまりきれいではありません。とりあえず、*.cppが302ファイルあるうち67ファイルがコピー対象となりました。
必要なファイルを選別してインストール
tmp$ cd ACE_wrappers/ace ace$ find . -maxdepth 1 -name "*.h" ! -name "config-[^w]*" \ -exec cp {} /cygdrive/d/lib/ace/include/ace/ \; ace$ cp config-all.h *.i *.inl /cygdrive/d/lib/ace/include/ace/ ace$ find . -maxdepth 1 -name "*.h" ! -name "config-[^w]*" \ -print | xargs grep "^[ ]*#[ ]*include" | grep ".cpp" | \ awk 'FS="\""{split($0, chank); gsub(/ace\//, "", chank[2]); \ print "cp", chank[2],"/cygdrive/d/lib/ace/include/ace/"}' >copy.list ace$ sh copy.list ace$
# include "Dynamic_Service.cpp"そこで、grep "#[ ]*include"とパターンを変更した。また、今後#の前に空白が入っていた場合に備えてgrep "^[ ]*#[ ]*include"とパターンを指定することにした。また、その場合、awkでprint $2でファイル名部分を取り出した場合、空白のためにずれてしまっていた。
# include "Dynamic_Service.cpp" ↑ ↑ ↑ $1 $2 $3そこで、"をセパレータ(FS)にセットしてsplitで分割してファイル名部分を取り出すようにした。
#include "Acceptor.cpp" # include "Dynamic_Service.cpp" ↑ ↑ ↑ chank[1] chank[2] chank[3]
ace$ cp config-lite.h /cygdrive/d/lib/ace/include/ace/ ace$ find os_include/ -name "*.h" -print|cpio -pd \ /cygdrive/d/lib/ace/include/ace/ ace$
ace$ cd QoS QoS$ mkdir /cygdrive/d/lib/ace/include/ace/QoS/ QoS$ cp *.h *.i /cygdrive/d/lib/ace/include/ace/QoS/ QoS$
QoSには現在のところ、*.inlはありません。また、*.hから#includeされている*.cppもありません。
ace$ cd RMCast RMCast$ mkdir /cygdrive/d/lib/ace/include/ace/RMCast/ RMCast$ cp *.h *.i /cygdrive/d/lib/ace/include/ace/RMCast/ RMCast$ find . -name "*.h" -print | xargs grep "^[ ]*#[ ]*include" | \ grep ".cpp" | awk 'FS="\""{split($0, chank); \ print "cp", chank[2],"/cygdrive/d/lib/ace/include/ace/RMCast/"}' \ >copy.list RMCast$ sh copy.list
RMCastには現在のところ、*.inlはありません。
ace$ cd SSL SSL$ mkdir /cygdrive/d/lib/ace/include/ace/SSL/ SSL$ cp *.h *.i *.inl /cygdrive/d/lib/ace/include/ace/SSL/ SSL$
SSLには現在のところ、*.hから#includeされている*.cppはありません。
netsvcsはaceとは違うディレクトリにあります。サンプルプログラムを見ると、ヘッダファイルを#includeするときにディレクトリ指定はありません。しかし、d:\lib\ace\include直下におくのも見苦しいので、d:\lib\ace\include\netsvcs以下に置くことにします。プログラムを作成するときは、プリプロセッサのパスにd:\lib\ace\include\netsvcsまでを指定しておく必要があります。
ACE_wrappers$ cd netsvcs/lib lib$ cp *.h /cygdrive/d/lib/ace/include/netsvcs/ lib$ find . -name "*.h" -print | xargs grep "^[ ]*#[ ]*include" | \ grep ".cpp" | awk 'FS="\""{split($0, chank); \ print "cp", chank[2],"/cygdrive/d/lib/ace/include/netsvcs/"}' \ >copy.list lib$ sh copy.list lib$
Windowsの共有ライブラリファイル(DLL)は、リンク時に必要なインポートライブラリファイル(*.lib)と実行時に必要なダイナミックリンクライブラリファイル(*.dll)に分かれています。一方、スタティックリンクライブラリファイル(*.lib)は1種類だけです。そこで、リンク解決時に必要なファイルと実行時に必要なファイルをインストールするディレクトリを分けます。なぜならば、実行時に必要なファイルのあるディレクトリは環境変数PATHに含めるからです。
ace$ find . -name "*.lib" -print ./ace.lib ./aced.lib ./acemfc.lib ./acemfcd.lib ./aces.lib ./acesd.lib ./QoS/ACE_QoS.lib ./QoS/ACE_QoSd.lib ./QoS/ACE_QoSs.lib ./QoS/ACE_QoSsd.lib ./RMCast/ACE_RMCast.lib ./RMCast/ACE_RMCastd.lib ./SSL/ACE_SSL.lib ./SSL/ACE_SSLd.lib ./SSL/ACE_SSLs.lib ./SSL/ACE_SSLsd.lib ace$ find . -name "*.lib" -exec cp {} /cygdrive/d/lib/ace/lib/ \; ace$
ace$ cd ../netsvcs/lib lib$ ls *.lib netsvcs.lib netsvcsd.lib lib$ cp *.lib /cygdrive/d/lib/ace/lib/ lib$
Windowsの共有ライブラリファイル(DLL)は、ライブラリを使用するアプリケーションが起動したときに読み込まれます(黙示のリンクの場合)。その際、DLLファイルは環境変数PATHの中から検索されるので、DLLファイルは環境変数PATHで指定するディレクトリに配置します。ここでACEに含まれる実行ファイル等はインストール先(例えばD:\lib\ace)の中にbinという名前のディレクトリを設けてコピーします。
ace$ cd ../bin bin$ find . \( -name "*.dll" -o -name "*.exe" \) -print ./ace.dll ./aced.dll ./acemfc.dll ./acemfcd.dll ./ACE_QoS.dll ./ACE_QoSd.dll ./ACE_RMCast.dll ./ACE_RMCastd.dll ./ACE_SSL.dll ./ACE_SSLd.dll ./netsvcs.dll ./netsvcsd.dll ./Release/gperf.exe bin$ find . \( -name "*.dll" -o -name "*.exe" \) \ -exec cp {} /cygdrive/d/lib/ace/bin \; bin$
ACEがどのバージョンかを示すファイルが1つあるので、これをコピーしておきます。
bin$ cd .. ACE_wrappers$ ls VERSION VERSION ACE_wrappers$ cp VERSION /cygdrive/d/lib/ace ACE_wrappers$
ACEを利用するアプリケーションでは、伝統的に環境変数ACE_ROOTを使用します。また、DLLファイルを置いたディレクトリを環境変数PATHに追加する必要があります。そこで、この2つの環境変数を設定しておきます。
環境変数名 | 設定方法 | 設定内容 |
---|---|---|
ACE_ROOT | 新規作成 | D:\lib\ace |
PATH | 追加 | %ACE_ROOT%\binを追加する |
ACEを使用するアプリケーションを開発する場合、そのプロジェクト設定ファイルにおいてインクルードファイルのパスと追加ライブラリのパスにACEのinclude、libを指定します。
上記のインストール操作をまとめて実行するスクリプトを用意すると便利です。
<未着手>
マイクロソフトから無償で入手できるVC++ 7.1相当のコンパイラ一式です。詳細はこちらのページにあります。
Borland C++は、製品版のBorland C++/C++ Builderと無償のBorland C++ Compilerがあります。ここでは無償のBorland C++ Compilerを使ってACEをビルドします。
上述のとおりACEのソースを入手します。
作業ディレクトリとして仮にF:\tmpの下に展開します。
ACE_wrapers\ace\config.h というファイルを新規に作成します。
// -*- C++ -*- #ifndef ACE_CONFIG_H #define ACE_CONFIG_H //#define ACE_HAS_WINNT4 0 #include "ace/config-win32.h" #endif /* ACE_CONFIG_H */ |
Visual C++の場合に指定したACE_HAS_ANSI_CASTSやACE_HAS_STANDARD_CPP_LIBRARYなどはデフォルトで有効になっています。Borlad C++の方がC++標準規格への準拠度が高いからでしょう。
Borland C++の場合は不要です。
環境変数ACE_ROOTとBCBVERを設定します。
F:\tmp>set ACE_ROOT=F:\tmp\ACE_wrappers F:\tmp>set BCBVER=5 F:\tmp>
もしACE_SSLをビルドするならば、環境変数SSL_ROOTを設定します。
※Borland C++でOpenSSLのビルドに失敗しているので、この設定は行ってません。
ビルド種類の使い分けは、makeに渡すオプションで指定します。
F:\tmp>cd ACE_wrappers F:\tmp\ACE_wrappers>cd ace F:\tmp\ACE_wrappers\ace>make -f Makefile.bor -DUNICODE : F:\tmp\ACE_wrappers\ace>
次の場所にファイルが生成されます。
F:\tmp\ACE_wrappers\ace>make -f Makefile.bor -DDEBUG -DUNICODE : F:\tmp\ACE_wrappers\ace>
F:\tmp\ACE_wrappers\ace>make -f Makefile.bor -DSTATIC -DUNICODE : F:\tmp\ACE_wrappers\ace>
F:\tmp\ACE_wrappers\ace>make -f Makefile.bor -DDEBUG -DSTATIC -DUNICODE : F:\tmp\ACE_wrappers\ace>
設定名 | 静的/動的ライブラリファイル | インポートライブラリファイル |
---|---|---|
DLL Release | ACE_wrappers\bin\Dynamic\Release\Unicode\ace_bu.dll ACE_wrappers\bin\Dynamic\Release\Unicode\ace_QoS_bu.dll ACE_wrappers\bin\Dynamic\Release\Unicode\ace_RMCast_bu.dll |
ACE_wrappers\bin\Dynamic\Release\Unicode\ace_bu.lib ACE_wrappers\bin\Dynamic\Release\Unicode\ace_QoS_bu.lib ACE_wrappers\bin\Dynamic\Release\Unicode\ace_RMCast_bu.lib |
DLL Debug | ACE_wrappers\bin\Dynamic\Debug\Unicode\ace_bud.dll ACE_wrappers\bin\Dynamic\Debug\Unicode\ace_QoS_bud.dll ACE_wrappers\bin\Dynamic\Debug\Unicode\ace_RMCast_bud.dll |
ACE_wrappers\bin\Dynamic\Debug\Unicode\ace_bud.lib ACE_wrappers\bin\Dynamic\Debug\Unicode\ace_QoS_bud.lib ACE_wrappers\bin\Dynamic\Debug\Unicode\ace_RMCast_bud.lib |
Static Release | ACE_wrappers\bin\Static\Release\Unicode\ace_bsu.lib ACE_wrappers\bin\Static\Release\Unicode\ace_QoS_bsu.lib ACE_wrappers\bin\Static\Release\Unicode\ace_RMCast_bsu.lib |
− |
Static Debug | ACE_wrappers\bin\Static\Debug\Unicode\ace_bsud.lib ACE_wrappers\bin\Static\Debug\Unicode\ace_QoS_bsud.lib ACE_wrappers\bin\Static\Debug\Unicode\ace_RMCast_bsud.lib |
− |
Borland C++用Makefileの場合、ACEのコアコンポーネントに加えて、ACE QoS、ACE RMCastのコンポーネントも生成されています。
ACEを利用するのに必要なファイルだけを抜き出して別なディレクトリにインストールします。Borland
C++用のMakefileには、インストール処理も記述されているので、makeを実行すればインストール作業が行えます。
以下、D:\lib\aceディレクトリ下にインストールする場合です。
D:\lib\ace +--- bin 実行ファイル、DLLファイルを格納 +--- include ヘッダファイル等を格納 | +--- ace +--- lib リンク時に必要なライブラリファイルを格納
F:\tmp\ACE_wrappers\ace>make -f Makefile.bor -DUNICODE \ -DINSTALL_DIR=D:\lib\ace install : F:\tmp\ACE_wrappers\ace>
F:\tmp\ACE_wrappers\ace>make -f Makefile.bor -DDEBUG -DUNICODE \ -DINSTALL_DIR=D:\lib\ace install : F:\tmp\ACE_wrappers\ace>
F:\tmp\ACE_wrappers\ace>make -f Makefile.bor -DSTATIC -DUNICODE \ -DINSTALL_DIR=D:\lib\ace install : F:\tmp\ACE_wrappers\ace>
F:\tmp\ACE_wrappers\ace>make -f Makefile.bor -DDEBUG -DSTATIC -DUNICODE \ -DINSTALL_DIR=D:\lib\ace install : F:\tmp\ACE_wrappers\ace>
ACEがどのバージョンかを示すファイルが1つあるので、これをコピーしておきます。
F:\tmp\ACE_wrappers\ace> cd .. F:\tmp\ACE_wrappers>copy VERSION D:\lib\ace 1 個のファイルをコピーしました。 F:\tmp\ACE_wrappers>
Cygwinは、Windows上でUNIXのAPIをエミュレーションする環境です。エミュレーション上に各種UNIXツールが移植されています。GCCも移植されているので、ここではCygwin上でGCCを使ってACEをビルドします。
最近はCygwinのビルド環境が整備されているので、容易にビルドすることができるようになりました。
Cygwin環境 | バージョン |
---|---|
Cygwin |
~$ uname -r 1.5.18(0.132/4/2) |
GCC |
~$ g++ --version g++ (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125) : |
make |
~$ make --version GNU Make 3.80 : |
上述のとおりACEのソースを入手します。
作業ディレクトリとして仮に/tmpの下に展開します。
/tmp/ACE_wrapers/ace/config.h ファイルを新規に作成します。
// -*- C++ -*- #ifndef ACE_CONFIG_H #define ACE_CONFIG_H #define ACE_HAS_STANDARD_CPP_LIBRARY 1 #include "ace/config-cygwin32.h" #endif /* ACE_CONFIG_H */ |
/tmp/ACE_wrapers/include/makeinclude/platform_macros.GNU ファイルを新規に作成します。
include $(ACE_ROOT)/include/makeinclude/platform_cygwin32.GNU |
環境変数ACE_ROOT、環境変数LD_LIBRARY_PATHを設定します。
tmp$ export ACE_ROOT=/tmp/ACE_wrappers tmp$ export LD_LIBRARY_PATH=$ACE_ROOT/ace:$LD_LIBRARY_PATH tmp$ cd $ACE_ROOT/ace ace$ make : ace$
makeはデフォルトではACEコアとRMCastをビルドする設定になっています。
makeのオプション | 内容 | 備考 |
---|---|---|
ssl=1 | ACE_SSLをビルドする | Cygwin用のOpenSSLをインストールしておく。なお、ACE_SSLはコンパイルエラー発生 |
rmcast=0 | ACE_RMCastをビルドしない | |
optimize=1 | 最適化オプション(-O3)を追加する | |
debug=0 | デバッグオプション(-g)を削除する | |
rapi=1 | ACE_QoSをビルドする。(RAPIライブラリが必要) | Cygwin用のRAPIライブラリが見当たらない |
static_libs=1 | スタティックリンクライブラリを作成する | |
shared_libs=0 | DLLをビルドしない | |
TCPU=pentium | 生成するバイナリはPentium用とする { pentiumpro | pentium | i486 | i386 } デフォルトはpentiumpro |
|
repo=1 |
Cygwinは、netinstallにおいてOpenSSLを提供しています。これをCygwin環境にインストールしてあれば、ACE_SSLのビルドが可能です。
設定名 | 静的/動的ライブラリファイル | インポートライブラリファイル |
---|---|---|
make | ACE_wrappers/ace/libACE.dll ACE_wrappers/ace/RMCast/libRMCast.dll |
ACE_wrappers/ace/libACE.dll.a ACE_wrappers/ace/RMCast/libRMCast.dll.a |
ACE_wrappers$ cd apps/gperf/src src$ make : src$
以下、/usr/localディレクトリ下にインストールする場合です。
/usr/local/ +--- bin ACEのDLLはここに格納 +--- include | +--- ace ACEのヘッダファイルを格納 +--- lib +--- ace ACEインポートライブラリを格納
ACE_wrappers$ cd ace ace$ cp *.h *.i *.inl /usr/local/include/ace/ ace$
ace$ cp libACE.dll /usr/local/lib/ace/ ace$
Debian GNU/Linux 3.0(Woody) for PowerPC にインストールした際の手順です。
GCCとmakeのバージョンは以下
work$ g++ -v Reading specs from /usr/lib/gcc-lib/powerpc-linux/2.95.4/specs gcc version 2.95.4 20011002 (Debian prerelease) work$ make -v GNU Make version 3.79.1, by Richard Stallman and Roland McGrath. Built for powerpc-unknown-linux-gnu Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Report bugs to <bug-make@gnu.org>.
上述のとおりACEのソースを入手します。
作業ディレクトリとして仮に/tmpの下に展開します。
/tmp/ACE_wrapers/ace/config.h ファイルを新規に作成します。Linux用に用意されているconfig-linux.hへのシンボリックリンクとして作成します。
work$ cd ACE_wrappers/ace ace$ ln -s config-linux.h config.h ace$
/tmp/ACE_wrapers/include/makeinclude/platform_macros.GNU ファイルを新規に作成します。Linux用に用意されているplatform_linux.GNUへのシンボリックリンクとして作成します。
ace$ cd ../include/makeinclude makeinclude$ ln -s platform_inux.GNU platform_macros.GNU makeinclude$
環境変数ACE_ROOT、環境変数LD_LIBRARY_PATHを設定します。
makeinclude$ cd ../.. ACE_wrappers$ export ACE_ROOT=`pwd` ACE_wrappers$ echo $ACE_ROOT /tmp/ACE_wrappers ACE_wrappers$
ACE_wrappers$ export LD_LIBRARY_PATH=$ACE_ROOT/ace:$LD_LIBRARY_PATH ACE_wrappers$ echo $LD_LIBRARY_PATH /tmp/ACE_wrappers/ace: ACE_wrappers$
makeを実行します。
ACE_wrappers$ cd ace ace$ make
ビルドされたライブラリは次のとおりです。
設定名 | 共有ライブラリファイル |
---|---|
make |
ACE_wrappers/ace/libACE.so.5.3.1 ACE_wrappers/ace/RMCast/libACE_RMCast.so.5.3.1 |
libACE_RMCast.so.5.3.1は、ace/RMCastの下に実体がありますが、aceの下にシンボリックリンクファイルが作成されます。シンボリックリンクファイルを含めると以下のように共有ライブラリファイルが生成されます。
ACE_wrappers/ace +--- libACE.so -> libACE.so.5.3.1 +--- libACE.so.5.3.1 +--- libACE_RMCast.so -> ACE_wrappers/ace/RMCast/libACE_RMCast.so.5.3.1 +--- libACE_RMCast.so.5.3.1 -> ACE_wrappers/ace/RMCast/libACE_RMCast.so.5.3.1 +--- RMCast +--- libACE_RMCast.so -> libACE_RMCast.so.5.3.1 +--- libACE_RMCast.so.5.3.1 |
ACE_wrappers$ cd apps/gperf/src src$ make : src$
g++はコンパイル過程で生成する中間ファイルをデフォルトでは.shobjというディレクトリの中に吐きます。
以下、/usr/localディレクトリ下にインストールする場合です。
/usr/local/ +--- bin ACEの実行ファイルはここに格納 +--- include | +--- ace ACEのヘッダファイルを格納 +--- lib +--- ace ACEの共有ライブラリファイルを格納
ACE_wrappers$ cd ace ace$ find . -maxdepth 1 -name "*.h" ! -name "config*" \ -exec cp {} /usr/local/include/ace/ \; ace$ cp config.h config-all.h config-linux* config-g++* /usr/local/include/ace/ ace$ cp *.i *.inl /usr/local/include/ace/ ace$
ace$ cd RMCast RMCast$ mkdir /usr/local/include/ace/RMCast/ RMCast$ cp *.h *.i /usr/local/include/ace/RMCast/ RMCast$
RMCastには現在のところ、*.inlはありません。
UNIXでは、共有ライブラリファイルはバージョン番号付きのファイル名で作成し、リンクするファイル名はいずれかのバージョン番号付きの共有ライブラリファイルへのシンボリックリンクとすることが多いです。
ファイル名 | ファイル種類 | |
---|---|---|
libACE.so |
シンボリックリンクファイル(リンク先:libACE.so.5.3.1) | |
libACE.so.5.3.1 |
共有ライブラリファイル |
このようにすれば、複数のバージョンの共有ライブラリファイルを同じディレクトリに置いておくことができ、プログラム開発時や実行時はシンボリックリンクファイルを参照するようにし、バージョンアップ毎の修正は不要となります。
ace$ cp libACE.so.5.3.1 /usr/local/lib/ace/ ace$ ln -s ./libACE.so.5.3.1 /usr/local/lib/ace/libACE.so
ace$ cd RMCast RMCast$ cp libACE_RMCast.so.5.3.1 /usr/local/lib/ace/ RMCast$ ln -s ./libACE_RMCast.so.5.3.1 /usr/local/lib/ace/libACE_RMCast.so RMCast$
ace$ ls libACE*.so.5.3.1 | \ sed 's|\(lib.*.so\)\(.5.3.1\)|cp \1\2 /usr/local/lib/ace/; \ ln -s ./\1\2 /usr/local/lib/ace/\1|g' > install.sh ace$ sh install.sh
ace$ cd ../apps/gperf/src src$ cp gperf /usr/local/bin/ ace$
ACEがどのバージョンかを示すファイルが1つあるので、これをコピーしておきます。
ace$ cd .. ACE_wrappers$ ls VERSION VERSION ACE_wrappers$ cp VERSION /usr/local/lib/ace/ ACE_wrappers$
Sun製コンパイラです。昔は、WorkShop C++、Forte C++、Sun ONE studio C++などと名称が変遷しています。
Solaris x86版では、なぜか最新のACEがビルドできず、OCI版のACE(TAO)をOCIのTAOページから入手します。商用UNIXと商用コンパイラの場合、OCIの方がビルドできるよう調整されていることが多いようです。
※ OCIはACE+TAOを配布しています。
作業ディレクトリとして、$HOME/workを設け、その下に展開します。
torutk$ cd work work$ gtar xzf TAO-1.3a_p1.tar.gz : work$ gtar xzf TAO-1.3a_jumbo_patch.tar.gz : work$ cd ACE_wrappers ACE_wrapperse$
$HOME/work/ACE_wrappers/ace/config.h ファイルを新規作成します。
#include "ace/config-sunos5.9.h" |
$HOME/work/ACE_wrapers/include/makeinclude/platform_macros.GNU ファイルを新規に作成します。
include $(ACE_ROOT)/include/makeinclude/platform_sunos5_sunc++.GNU |
コンパイルにあたって、デバッグモード、最適化モードの2つを作成します。ライブラリ名が同じになるので、2回ビルドすることになります。
ACE_wrappers$ export ACE_ROOT=`pwd` ACE_wrappers$ echo $ACE_ROOT /export/home/torutk/work/ACE_wrappers ACE_wrappers$
ACE_wrappers$ export LD_LIBRARY_PATH=$ACE_ROOT/ace:$LD_LIBRARY_PATH ACE_wrappers$
ダイナミックリンクライブラリとスタティックリンクライブラリの両方をビルドします(static_libs=1)。
RMCastをビルドします(rmcast=1)。SSLをビルドします(ssl=1)。QoSはRAPI(RSVP
API)を必要とするようなのですが、SolarisにRSVP
APIがあるかどうか不明なので省略。
ACE_wrappers$ cd ace ace$ gmake static_libs=1 rmcast=1 ssl=1 debug=1
ssl=1としても、SSLがビルドされませんでした。
最適化モードでビルドするときは、通常optimize=1としますが、Sunのコンパイラのときは、fast=1とします。
ACE_wrappers$ cd ace ace$ gmake static_libs=1 rmcast=1 fast=1 : ace$
Sun製コンパイラです。昔は、WorkShop C++、Forte C++、Sun ONE studio C++などと名称が変遷しています。
ACE-5.4.8はビルド可能です。
$HOME/work/ACE_wrappers/ace/config.h ファイルを新規作成します。
#include "ace/config-sunos5.10.h" |
$HOME/work/ACE_wrapers/include/makeinclude/platform_macros.GNU ファイルを新規に作成します。
include $(ACE_ROOT)/include/makeinclude/platform_sunos5_sunc++.GNU |
以下、/opt/taoディレクトリ下にインストールする場合です。
/opt/tao/ +--- bin ACEの実行ファイルはここに格納 +--- include | +--- ace ACEのヘッダファイルを格納 +--- lib +--- ace ACEの共有ライブラリファイルを格納
ACE_wrappers$ cd ace ace$ cp `ls *.h | grep -v config` /opt/tao/include/ace/ ace$ cp config.h config-all.h config-sunos5.[56789].h config-sunos5.10.h \ config-lite.h config-macros.h config-posix.h /opt/tao/include/ace/ ace$ cp *.i *.inl /opt/tao/include/ace/ ace$