[ C++で開発 ] [ TAO CORBA実装 ]
Solaris環境では、主に次の2つのコンパイラが利用されています。
GCCバージョン | インストール場所 | |
---|---|---|
2.95.3 |
/opt/sfw/gcc-2/bin/g++ |
|
3.4.3 |
/usr/sfw/bin/g++ |
今回は、SunStudio 12 Update1のC++コンパイラを使用してビルドします。
ただし、ACE+TAOは標準ではGNU make用のGNUmakefileを提供しているので、Solaris標準makeコマンド(/usr/ccs/bin/make)ではビルドできません。GNU makeコマンド(/usr/sfw/bin/gmake)を用いてビルドします。
ACE_SSLをビルドするには、SSLのライブラリが必要です。Solaris 10の場合、以下に標準でインストールされています。
32bit版ライブラリ
/usr/sfw/lib/libssl.so
/usr/sfw/lib/libcrypto.so
64bit版ライブラリ
/usr/sfw/lib/64/libssl.so /usr/sfw/lib/64/libcrypto.so
ACE_QoSをビルドするには、RSVP API(RAPI)が必要です。
作業ディレクトリとして、$HOME/workを設け、その下に展開します。
torutk$ cd work work$ bzcat ACE+TAO+CIAO.tar.bz2 | tar xvf - : work$ cd ACE_wrappers ACE_wrapperse$
展開すると、約260MBのサイズとなります。ビルドすると1GB超になります
ACE+TAO-5.8.0は、Sun Studio 12u1でビルドするとエラーが発生するため、一部修正が必要なファイルがあります。
--- platform_sunos5_sunc++.GNU.orig 2010年 2月 26日 (金)
+++ platform_sunos5_sunc++.GNU 2010年 7月 31日 (土)
@@ -66,7 +66,7 @@
CC = cc
CXX = CC
-CC_VERSION := $(shell $(CXX) -V 2>&1)
+CC_VERSION := $(shell $(CXX) -V 2>&1 | head -1)
### CC 5.4 provides insufficient preprocessor output (at 111715-17 2005/10/13)
### We need to use cc instead - see bugzilla #2478.
CC -Vコマンドの実行結果は以下のように2行になります。
makeinclude$ CC -V
CC: Sun C++ 5.10 SunOS_i386 2009/06/03
使用法: CC [ オプション ] ファイル # 詳細は 'CC -flags' を参照してください。
makeinclude$
これを変数に代入すると、改行込みで1つの文字列として扱われます。これを別な場所でsedで解析してバージョン番号を判定する箇所がありますが、日本語交じりで改行が途中に入った文字列をうまく扱えないので、ここではバージョン番号が含まれる1行目だけを切り出すように修正しました。
補足) LANG=Cで実行すると、この問題は発生しません。
makeinclude$ LANG=C CC -V
CC: Sun C++ 5.11 SunOS_i386 2010/08/13
usage: CC [ options ] files. Use 'CC -flags' for details
makeinclude$
コンパイラの各バージョン決め打ちにコンパイルフラグを指定しているため、新しいコンパイラバージョンに対応していない。
else ifeq (C++ 5.10,$(findstring C++ 5.10,$(CC_VERSION))) CFLAGS += -m64 LDFLAGS += -m64 + else + ifeq (C++ 5.11,$(findstring C++ 5.11,$(CC_VERSION))) + CFLAGS += -m64 + LDFLAGS += -m64 else CFLAGS += -xarch=v9 LDFLAGS += -xarch=v9
--- config-sunos5.5.h.orig 2010年 3月 16日 (火)
+++ config-sunos5.5.h 2010年 7月 31日 (土)
@@ -381,8 +381,13 @@
#if defined (__SUNPRO_CC)
# define ACE_CC_NAME ACE_TEXT ("SunPro C++")
-# define ACE_CC_MAJOR_VERSION (__SUNPRO_CC >> 8)
-# define ACE_CC_MINOR_VERSION (__SUNPRO_CC & 0x00ff)
+# if __SUNPRO_CC >= 0x5100
+# define ACE_CC_MAJOR_VERSION (__SUNPRO_CC >> 12)
+# define ACE_CC_MINOR_VERSION ((__SUNPRO_CC & 0x0ff0) >> 4)
+# else
+# define ACE_CC_MAJOR_VERSION (__SUNPRO_CC >> 8)
+# define ACE_CC_MINOR_VERSION (__SUNPRO_CC & 0x00ff)
+# endif /* __SUNPRO_CC >= 0x5100 */
# define ACE_CC_BETA_VERSION (0)
#elif defined (__GNUG__)
# define ACE_CC_MAJOR_VERSION __GNUC__
__SUNPRO_CC マクロは、以下のように定義されます。
コンパイラ・バージョン | C++コンパイラ・バージョン | __SUNPRO_CCの定義値 |
---|---|---|
Sun Workshop 3.0 (Sun Workshop Compiler C++ 4.2) |
Sun C++ 4.2 | 0x420 |
Sun Workshop 5.0 | Sun C++ 5.0 | 0x500 |
Forte 6 | Sun C++ 5.1 | 0x510 |
Forte 6 Update1 | Sun C++ 5.2 | 0x520 |
Forte 6 Update2 | Sun C++ 5.3 | 0x530 |
Sun ONE Studio 7 | Sun C++ 5.4 | 0x540 |
Sun Studio 8 | Sun C++ 5.5 | 0x550 |
Sun Studio 9 | Sun C++ 5.6 | 0x560 |
Sun Studio 10 | Sun C++ 5.7 | 0x570 |
Sun Studio 11 | Sun C++ 5.8 | 0x580 |
Sun Studio 12 | Sun C++ 5.9 | 0x590 |
Sun Studio 12 Update1 | Sun C++ 5.10 | 0x5100 |
Solaris Studio 12.2 | Sun C++ 5.11 | 0x5110 |
Sun Studio 12 Update1から、マイナーバージョン番号が2桁になったのに伴い、__SUNPRO_CCマクロに定義される16進数値の表現が変更されました。そのため、バージョンを判定して取得方法を修正しました。
$HOME/work/ACE_wrappers/ace/config.h ファイルを新規作成します。
#include "ace/config-sunos5.10.h" #define ACE_HAS_IPV6
今回はIPv6を有効にしてビルドするので、ACE_HAS_IPV6の定義を追加しています。
config-sunos5.10.hをインクルードすると、以下のインクルードが芋づる的に発生します。
config-sunos5.10.h +- config-sunos5.9.h +- config-sunos5.8.h +- config-sunos5.7.h +- config-sunos5.6.h +- config-sunos5.5.h +- sys/feature_tests.h +- config-posix.h +- unistd.h
コンパイラにSunStudio 12 Update1 C++ (__SUNPRO_CC == 0x5100)を使用し、標準モードでビルドする場合、以下の定義がなされます。
// config-sunos5.5.h #define ACE_LACKS_STDINT_H // #define ACE_LACKS_ALPHASORT → config-sunos5.5.hで定義、config-sunos5.10.hで定義削除(undef) // #define ACE_LACKS_LOG2 → config-sunos5.5.hで定義、config-sunos5.10.hで定義削除(undef) // #define ACE_LACKS_GETLOADAVG → config-sunos5.5.hで定義、config-sunos5.7.hで定義削除(undef) #define ACE_HAS_POSIX_PTHREAD_SEMANTICS → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ // config-posix.h #define ACE_HAS_POSIX_REALTIME_SIGNALS #define ACE_HAS_AIO_CALLS #define ACE_HAS_POSIX_SEM #define ACE_HAS_POSIX_SEM_TIMEOUT // #define ACE_HAS_SHM_OPEN → config-sunos5.5.hで定義、config-sunos5.6.hで定義削除(undef) #define ACE_HAS_THREADS #define ACE_HAS_PTHREADS #define ACE_HAS_PTHREADS_STD #define ACE_HAS_POSIX_MESSAGE_PASSING // config-sunos5.5.h #define ACE_LACKS_MEMORY_H #define ACE_HAS_TEMPLATE_TYPEDEFS #define ACE_HAS_STANDARD_CPP_LIBRARY 1 #define ACE_USES_STD_NAMESPACE_FOR_STDCPP_LIB 1 #define ACE_HAS_THR_C_DEST #define ACE_HAS_NEW_NOTHROW → platform_macros.GNUでexceptions=1を指定すると、ACE_HAS_EXCEPTIONSが定義される #define ACE_CAST_CONST const #define ACE_HAS_HI_RES_TIMER #define ACE_HAS_SIG_C_FUNC #define ACE_HAS_TEMPLATE_SPECIALIZATION #define ACE_HAS_XPG4_MULTIBYTE_CHAR #define ACE_LACKS_LINEBUFFERED_STREAMBUF #define ACE_LACKS_SIGNED_CHAR #define ACE_NEW_THROWS_EXCEPTIONS #define ACE_HAS_CUSTOM_EXPORT_MACROS #define ACE_Proper_Export_Flag __symbolic #define ACE_Proper_Import_Flag __global #define ACE_EXPORT_SINGLETON_DECLARATION(T) template class ACE_Proper_Export_Flag T #define ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) \ template class ACE_Proper_Export_Flag SINGLETON_TYPE <CLASS, LOCK>; #define __ACE_INLINE__ #define ACE_HAS_REGEX #define ACE_HAS_HANDLE_SET_OPTIMIZED_FOR_SELECT #define ACE_HAS_NONCONST_SELECT_TIMEVAL #define ACE_HAS_P_READ_WRITE #define ACE_HAS_RECURSIVE_THR_EXIT_SEMANTICS #define ACE_HAS_UALARM #define ACE_LACKS_UALARM_PROTOTYPE #define ACE_HAS_SYSV_IPC #define ACE_HAS_CONSISTENT_SIGNAL_PROTOTYPES #define ACE_HAS_SYS_SYSTEMINFO_H #define ACE_HAS_SYSV_SYSINFO #define ACE_HAS_MSG #define ACE_HAS_SYS_SYSCALL_H #define ACE_HAS_TERMIOS #define ACE_HAS_AUTOMATIC_INIT_FINI #define ACE_HAS_POSIX_NONBLOCK #define ACE_HAS_CPLUSPLUS_HEADERS #define ACE_HAS_IP_MULTICAST #define ACE_HAS_CONST_CHAR_SWAB #define ACE_HASS_ALLOCA #define ACE_HAS_POLL #define ACE_HAS_POSIX_TIME #define ACE_HAS_CLOCK_GETTIME #define ACE_HAS_CLOCK_SETTIME #define ACE_HAS_PROC_FS #define ACE_HAS_PRUSAGE_T #define ACE_HAS_GETRUSAGE #define ACE_HAS_SIG_ATOMIC_T #define ACE_HAS_SIGINFO_T #define ACE_HAS_UCONTEXT_T #define ACE_HAS_SYS_SOCKIO_H #define ACE_HAS_SSIZE_T #define ACE_HAS_STREAMS #define ACE_HAS_STREAMS_PIPES #define ACE_HAS_STRBUF_T #define ACE_HAS_SVR4_DYNAMIC_LINKING #define ACE_HAS_SVR4_GETTIMEOFDAY #define ACE_HAS_SVR4_TLI #define ACE_HAS_SYS_FILIO_H #define ACE_HAS_STRSIGNAL // #define ACE_LACK_MKSTEMP → config-sunos5.5.hで定義、config-sunos5.6.hで定義削除(undef) #define ACE_LACK_SYS_SYSCTL_H #define ACE_HAS_CHARPTR_SHMDT #define ACE_HAS_POSIX_GETPWNAM_R → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ #define ACE_HAS_THREADS → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ #define ACE_MT_SAFE 1 → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ // #define ACE_LACKS_RWLOCK_T → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ → config-sunos5.5.hで定義、config-sunos5.8.hで定義削除(undef) #define ACE_HAS_PTHREADS → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ #define ACE_HAS_PTHREADS_STD // #define ACE_HAS_ONLY_SCHED_OTcdHER → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ → config-sunos5.5.hで定義、config-sunos5.7.hで定義削除(undef) #define ACE_HAS_SIGWAIT → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ #define ACE_HAS_SIGTIMEDWAIT → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ #define ACE_HAS_SIGSUSPEND → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ // #define ACE_LACKS_PTHREAD_ATTR_SETSTACK → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ → config-sunos5.5.hで定義、config-sunos5.10.hで定義削除(undef) #define ACE_HAS_THREAD_SPECIFIC_STORAGE → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ #define ACE_HAS_REENTRANT_FUNCTIONS → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ // #define ACE_NEEDS_LWP_PRIO_SET → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ → config-sunos5.5.hで定義、config-sunos5.7.hで定義削除(undef) #define ACE_HAS_THR_YIELD → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ #define ACE_LACKS_PTHREAD_YIELD → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ #define ACE_HAS_PRIOCNTL #define ACE_HAS_TIMOD_H #define ACE_HAS_TIUSER_H #define ACE_HAS_TLI_PROTOTYPES // #define ACE_HAS_BROKEN_T_ERROR → config-sunos5.5.hで定義、config-sunos5.7.hで定義削除(undef) #define ACE_HAS_TLI #define ACE_HAS_GETPAGESIZE 1 #define ACE_HAS_IDTYPE_T #define ACE_HAS_GPERF #define ACE_HAS_DIRENT #define ACE_LACKS_ISCTYPE // #define ACE_LACKS_ISBLANK → config-sunos5.5.hで定義、config-sunos5.10.hで定義削除(undef) #define ACE_CC_NAME "SunPro C++" #define ACE_CC_MAJOR_VERSION 51 → SunStudio 12u1からバージョン表記の桁数が変わったため誤認識 #define ACE_CC_MINOR_VERSION 0 → SunStudio 12u1からバージョン表記の桁数が変わったため誤認識 #define ACE_CC_BETA_VERSION 0 // #define ACE_HAS_X86_STAT_MACROS → config-sunos5.5.hで定義、config-sunos5.8.hで定義削除(undef) #define ACE_MALLOC_ALIGN 8 #define ACE_LACKS_SETREUID_PROTOTYPE #define ACE_LACKS_SETREGID_PROTOTYPE #define ACE_LACKS_INET_ATON // #define ACE_LACKS_WCSTOLL → config-sunos5.5.hで定義、config-sunos5.10.hで定義削除(undef) // #define ACE_LACKS_WCSTOULL → config-sunos5.5.hで定義、config-sunos5.10.hで定義削除(undef) #define ACE_HAS_3_PARAM_READDIR_R → コンパイル時にマクロ_POSIX_PTHREAD_SEMANTICS定義時のみ #define ACE_HAS_SOCK_BUF_SIZE_MAX #define ACE_LACKS_SETENV #define ACE_LACKS_UNSETENV // config-sunos5.6.h #define ACE_LACKS_UNBUFFERED_STREAMBUF 1 #define ACE_TEMPLATES_REQUIRE_SOURCE #define ACE_HAS_THR_C_FUNC #define ACE_HAS_STDCPP_STL_INCLUDES #define ACE_HAS_STRING_CLASS #define ACE_LACKS_IOSTREAM_FX #define ACE_POSIX_AIOCB_PROACTOR // #define ACE_HAS_LIMITED_SELECT → config-sunos5.6.hで定義、config-sunos5.7.hで定義削除(undef) // config-sunos5.7.h #define ACE_HAS_VFWPRINTF #define ACE_SHM_OPEN_REQUIRES_ONE_SLASH #define ACE_HAS_SYS_LOADAVG_H #define ACE_HAS_SOCKLEN_T #define ACE_HAS_3_PARAM_WCSTOK #define ACE_HAS_DEV_POLL // config-sunos5.8.h #define ACE_HAS_TIME_ZONE #define ACE_THR_PRI_OTHER_MIN (long) -20 #define ACE_HAS_BROKEN_GETHOSTBYADDR_V4MAPPED // config-sunos5.9.h #define ACE_HAS_SENDFILE 1 #define ACE_LACKS_THR_CONCURRENCY_FUNCS // config-sunos5.10.h #define ACE_HAS_SCANDIR #define ACE_HAS_SOLARIS_ATOMIC_LIB
$HOME/work/ACE_wrapers/include/makeinclude/platform_macros.GNU ファイルを新規に作成します。
ssl=1 # exceptions=1 # default # inline=1 # default security=1 minimum_corba=0 ami=1 rt_corba=1 smart_proxies=1 interceptors=1 interface_repo=1 corba_messaging=1 rmcast=1 qos=0 probe=0 profile=0 fakesvcconf=0 shared_libs_only=1 # no_hidden_visibility=1 # default # distrib=1 # default stlport=1 # buildbits=64 # debug=1 # default (or debug=0 if release build) fast=0 # (or fast=1 if solaris specific optimize build) CFLAGS += -D_POSIX_PTHREAD_SEMANTICS #TAO_ORBSVCS=CosNaming,CosEvent,CosNotification,RTEvent include $(ACE_ROOT)/include/makeinclude/platform_sunos5_sunc++.GNU |
使用するオプションについては、$HOME/work/ACE_wrapers/include/makeinclude/wrapper_macros.GNUのコメントを見ると説明が記載されています。
指定フラグ名 | 内容 | 影響するコンパイルオプション | デフォルト値 | |
---|---|---|---|---|
V | ace_for_tao | ace_for_taoサブセットをビルドする。TAOを使う際に必要な機能だけ持ったACEを生成する | ||
ace_with_x11 | 0 | |||
buildbits | 32bit/64bitモード(=64)のコンパイル指定 | -xarch=generic64 | 未定義 | |
compat4 | 旧いC++モードを有効にする | 0 | ||
V | debug | デバッグオプション指定でコンパイルする | DCFLAGS および DCCFLAGS | 1 |
distrib | 作成したプログラムを配布する(=1)、=0だとビルドした時点のパスにライブラリがあることを前提とした右記の-Rオプションが指定される | -R $(ACE__ROOT)/lib | 0 | |
V | dmalloc | dmallocを使用してビルドする | CPPFLAGS および LDFLAGS | |
V | exceptions | C++例外機構を使用する | 1 | |
V | fast | Sun C++において最適化-fastオプション指定でコンパイルする | -fast | |
V | fl | FlTk(Fast Light Toolkit)を使用してビルドする | ||
V | fox | Fox Toolkitを使用してビルドする | ||
V | include_env | CORBA::Environment引数を使用(TAO 1.2.2後方互換) | ||
V | inline | ACEインライン化を有効 | 1 | |
V | link_groups | GNUコンパイラ専用 | ||
V | minimum_corba | minimumCORBAをサポートする | ||
V | mtrace | GNU libcの拡張機能 mtraceを使用してビルドする | CPPFLAGS | |
no_hidden_visibility | 共有ライブラリの可視性をhiddenにしない(=1) |
0:-xldscope=hidden 1:-DACE_HAS_CUSTOM_EXPORT_MACROS=0 |
1 | |
V | optimize | 最適化オプション指定でコンパイルする | ||
V | probe | ACE_Timeprobesを有効にする | ||
V | profile | プロファイリングオプション指定でコンパイルする | ||
V | purify | メモリリーク検査ツールPurify | ||
V | quantify | プロファイリングツールQuantify | ||
V | repo | GNUテンプレートリポジトリを使う | ||
rtti | 実行時型識別(RTTI)を有効(compat4指定時のみ有効) | -features=c | 1 | |
V | shared_libs | 共有ライブラリを生成する | -xldscope=hidden | 1 |
V | static_libs | 静的リンクライブラリを生成する | 0 | |
V | shared_libs_only | 共有ライブラリだけを生成する | ||
V | static_libs_only | 静的リンクライブラリだけを生成する | ||
V | static_link | 静的リンクライブラリとだけリンクする | ||
stdcpplib | 1 | |||
V | stlport | STLPortを使用してビルドする | -library=stlport4 | |
V | symlinks | libディレクトリにシンボリックリンクを作成する | ||
V | templates | テンプレート型のインスタンス化を自動 | automatic | |
V | threads | スレッドサポート | -mt | 1 |
V | trio | trioを使用してビルドする | CPPFLAGS および LIBS | |
V | xt | X11 Toolkitを使用してビルドする#define ACE_LACKS_THR_CONCURRENCY_FUNCS | ||
V | tk | Tcl/Tkを使用してビルドする | ||
tk_reactor | 0 | |||
V | qt | Qtを使用してビルドする | ||
V | ssl | OpenSSLを使用してビルドする | ||
V | rapi | RAPIを使用してビルドする | ||
V | rwho | rwhoを使用する | ||
V | pipes | コンパイラに-pipeオプションを渡す | ||
split | ||||
V | sctp | TAO SCIOP および ACE SCTP ラッパー | ||
V | versioned_so | リンク時にバージョン番号まで一致したライブラリファイルとリンクする | -h $(SONAME) | 1 |
V | wfmo | |||
V | winregistry | |||
- | -DSUN_CC_HAS_PVFC_BUG |
no_hidden_visibility=0を指定すると、TAO_Serviceの生成時にリンクエラーが発生します。libTAOが参照するシンボルACE_TSS_C_cleanupが未定義となります。libACE.soをnmコマンドで見ると、このACE_TSS_C_cleanupがLOCALとなっています。
[336] | 1557840| 76|FUNC |LOCL |2 |12 |ACE_TSS_C_cleanup
TAO_ORBSVCSについては、ACE_wrappers/TAO/orbsvcs/orbsvcs/GNUmakefile.*を参照します。CORBA標準サービスやTAOが提供するサービスをビルドする場合に指定します。指定しない場合、全てのサービスをビルドします。
Naming | |||||
Event | |||||
CosEvent | |||||
Time | |||||
Trader | |||||
ImplRepo | |||||
Property | |||||
AV | |||||
Concurrency | |||||
LifeCycle | |||||
PortableGroup | |||||
CosLoadBalancing | |||||
Notify | |||||
Trader | |||||
EventLog | |||||
Log | |||||
FTORB_Utils | |||||
FTRT_ClientORB | |||||
FTRT_EventChannel | |||||
FT_ServerORB | |||||
FaultTolerance | |||||
FtRtEvent | |||||
HTIOP | |||||
IFRService | |||||
RTCORBAEvent | |||||
Sched | |||||
RTEvent | |||||
RTEventLog | |||||
RTKokyuEvent | |||||
RTSchedEvent | |||||
RT_Notify | |||||
Security | |||||
SSLIOP |
Solaris OSは、2つの種類のスレッドAPIが利用できます。1つは、旧来からのSolarisスレッドAPI、そしてもう1つはPOSIXスレッドAPIです。ACE/TAOではデフォルトでは両方のスレッドAPIを使用可能としていますが、以下の定義を追加することによってPOSIXスレッドだけに限定することができます。
CFLAGS += -D_POSIX_PTHREAD_SEMANTICS |
ACE_wrappers$ export ACE_ROOT=`pwd` ACE_wrappers$ echo $ACE_ROOT /export/home/torutk/work/ACE_wrappers ACE_wrappers$
ACE_wrappers$ export TAO_ROOT=$ACE_ROOT/TAO ACE_wrappers$ echo $TAO_ROOT /export/home/torutk/work/ACE_wrappers/TAO ACE_wrappers$
ACE_wrappers$ export LD_LIBRARY_PATH=$ACE_ROOT/ace:$LD_LIBRARY_PATH ACE_wrappers$
ACE SSLのビルドを行う際は設定する必要があります。
32bit版なら以下の設定です。
ACE_wrappers$ export SSL_ROOT=/usr/sfw ACE_wrappers$
64bit版のときは、少々対処が必要です。ACE+TAOのビルド設定では、環境変数SSL_ROOTの下が次のディレクトリ構造になっていることを前提としています。
$(SSL_ROOT) +--- include | +--- openssl | +--- OpenSSLのヘッダーファイル +--- lib +--- OpenSSLのライブラリファイル
そこで、作業用ディレクトリに仮のSSL_ROOTを設定し、そのディレクトリ下にシンボリックリンクとしてincludeとlibを作成します。
ACE_wrappers$ mkdir SSL_ROOT ACE_wrappers$ cd SSL_ROOT SSL_ROOT$ ln -s /usr/sfw/include include SSL_ROOT$ ln -s /usr/sfw/lib/64 lib SSL_ROOT$ export SSL_ROOT=`pwd` SSL_ROOT$
SunStudio11コンパイラへのパス、ACEのbinへのパスを追加します。
ACE_wrappers$ PATH=/opt/SUNWspro/bin:/usr/bin:/usr/ccs/bin:/usr/sfw/bin ACE_wrappers$ PATH=$PATH:$ACE_ROOT/bin ACE_wrappers$
TAOディレクトリには、TAO_ACE.mwcファイルがあります。この中は以下の記述となっています。
// -*- MPC -*- // $Id: TAO_ACE.mwc 73785 2006-07-27 18:07:59Z wotte $ workspace { $(ACE_ROOT)/ace $(ACE_ROOT)/apps/gperf/src $(ACE_ROOT)/ACEXML/common $(ACE_ROOT)/ACEXML/parser/parser $(ACE_ROOT)/ACEXML/apps/svcconf $(ACE_ROOT)/Kokyu/Kokyu.mpc $(ACE_ROOT)/protocols tao TAO_IDL utils orbsvcs exclude { orbsvcs/tests orbsvcs/performance-tests orbsvcs/examples } } |
TAOが必要とするACE、gperf、ACEXMLなども含めてビルドする設定となっています。この設定でTAOをビルドします。そこで、MPCツールを使ってまずTAOACE.mwcファイルからGNU make用のメイクファイルを生成します。
ACE_wrappers$ cd TAO TAO$ mwc.pl -type gnuace TAO_ACE.mwc Using .../ACE+TAO/ACE_wrappers/bin/MakeProjectCreator/config/MPC.cfg CIAO_ROOT was used in the configuration file, but was not defined. DANCE_ROOT was used in the configuration file, but was not defined. Generating 'gnuace' output using TAO_ACE.mwc Skipping SSL_FOR_TAO (ssl_for_tao.mpc), it requires ace_for_tao. Skipping QoS (qos.mpc), it requires qos. Skipping ACE_FoxReactor (ace_foxreactor.mpc), it requires fox. Skipping ACE_FOR_TAO (ace_for_tao.mpc), it requires ace_for_tao. Skipping ACE_Qt4Reactor_moc (ace_qt4reactor.mpc), it requires qt4. Skipping ACE_Qt4Reactor (ace_qt4reactor.mpc), it requires qt4. Skipping ace_svcconf_gen (svcconfgen.mpc), it requires ace_svcconf_gen. Skipping ZlibCompressor (ZlibCompressor.mpc), it requires zlib. Skipping Bzip2Compressor (Bzip2Compressor.mpc), it requires bzip2. Skipping TAO_FoxResource (FoxResource.mpc), it requires fox. Skipping LzoCompressor (LzoCompressor.mpc), it requires lzo1. Skipping TAO_IDL_GEN (tao_idl_fe.mpc), it requires tao_idl_fe_gen. 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. Generation Time: 3m 30s TAO$
ワークスペースを生成するので、MPCツールの中のmwc.plコマンドを使用します。
ACE 5.5.5からは、-typeオプションで生成するプロジェクト種類を明示的に指定する必要があります。
処理時間目安:AMD Phenom 9750 (2.4GHz)で3分30秒
注)TAO_IDL_GENがSkippingになっているのはおかしいですね。
ACE_wrappers/TAO/TAO_IDL/tao_idl_fe.mpcを見ると、
requires += tao_idl_fe_gen
という記述があります。
ビルドは、TAOディレクトリで実行します。
TAO$ gmake 2>&1 | tee make.log : TAO$
処理時間目安:AMD Phenom 9750で2時間20分
デフォルトではビルドする対象が多いので、不要なサービスはビルドしないようにするとよいかもしれません。
コンパイルオプション
CC -D_POSIX_PTHREAD_SEMANTICS -mt -m64 -DACE_HAS_KSTAT -g -DACE_HAS_KSTAT -library=stlpo rt4 -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 -I/home/toru/work/ACE+TAO/ACE _wrappers -DACE_HAS_SCTP -DACE_HAS_LKSCTP -DACE_HAS_EXCEPTIONS -D__ACE_INLINE__ -DACE_HAS_ STLPORT -I.. -DACE_BUILD_DLL -c -KPIC -o .shobj/Local_Name_Space.o Local_Name_Space.cpp
リンクオプション
CC -G -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 -I/home/toru/work/ACE+TAO/A CE_wrappers -DACE_HAS_SCTP -DACE_HAS_LKSCTP -DACE_HAS_EXCEPTIONS -D__ACE_INLINE__ -DACE_HA S_STLPORT -I.. -DACE_BUILD_DLL -h libACE.so.5.8.1 -o libACE.so.5.8.1 ...
ACE+TAOをビルドすると、作業ディレクトリは2GB超になります。必要なものだけをコピーして使用します。現状では残念ながらインストール用のスクリプトが提供されていないので、自分でファイルをコピーすることになります。
Solarisでは、サードパーティ製のアプリケーションは/opt下にインストールするのが流儀のようです。そこで、/optの下にTAOというディレクトリを作成し、その中にインストールすることにします。
# PS1="\W> " ACE_wrappers> mkdir /opt/TAO ACE_wrappers>
TAOの下のディレクトリ構成は、ACE+TAOのディレクトリ構成と同じにします。ディレクトリ構成を変更すると、ACE+TAOで提供されるMakefileのビルド環境を修正する必要が生じるためです。すべて自力でコントロールするなら好みのディレクトリ構成でもよいでしょう。
ACEのヘッダーファイルをコピーします。
ACE_wrappers> find ace \( -name "*.h" -o -name "*.hpp" -o -name "*.inl" \) -print | cpio -pmd /opt/TAO ACE_wrappers> find ace -name "*.h" | xargs grep "^[ ]*#[ ]*include" | grep ".cpp" | nawk 'FS="\""{split($0, chank); gsub(/.*\//, "", chank[2]); print "find ace -name", chank[2], " | cpio -pmd /opt/TAO/"}' > install_ace.sh ACE_wrappers> sh ./install_ace.sh ACE_wrappers>
aceディレクトリ下の拡張子.h、.inlを/opt/TAOにディレクトリ構造を維持してコピーします。
拡張子.hの中において、#include文で拡張子.cppをインクルードしているものがあります。この.cppはヘッダーファイルと同じ扱いをする必要があります。したがって、これらを抜き出してコピーします。
抜き出し方法は、aceディレクトリ以下の拡張子.hファイルに含まれる#include "XX.cpp"行を抜き出し、XX.cppの部分文字列を取り出し、これをfind文で検索しcpioでディレクトリ構造を保持したままコピーするスクリプトを生成し実行するものです。
簡単に説明すると、.hファイルの中で#include文の一部に、#の前や#とiの間に空白が含まれていたりするので、空白が含まれてもよいようにgrepで正規表現を組んでいます。また、#include文の行からインクルードするファイル名部分だけを取り出すためにnawkを使っています。セパレータを"とすると簡単にファイル名部分が切り出せます。ただし、ファイル名部分にはディレクトリパスが付いているもの、付いていないものがあるので、ディレクトリ部分を削除するためにnawkのgsub関数でディレクトリ部分を削除しています。このあと、findでファイル名を検索してディレクトリ構造を保持してコピーするスクリプト文を作成しています。
ACE/TAOのメイクファイル類をコピーします
ACE_wrappers> cp -r include /opt/TAO ACE_wrappers> echo TAO/rules.tao.GNU | cpio -pmd /opt/TAO ACE_wrappers>
ACE/TAOを利用するアプリケーションをビルドする際に、これらメイクファイル用定義ファイルを使用します。
TAOのヘッダーファイルをコピーします。TAOのコア部分と、CORBA共通サービス類の部分があります。
ACE_wrappers> find TAO/tao TAO/orbsvcs \( -name "*.h" -o -name "*.inl" \) -print | grep -v "examples" | grep -v "tests" | cpio -pmd /opt/TAO ACE_wrappers> find TAO/tao TAO/orbsvcs -name "*.h" -o \( -name tests -o -name performance-tests -o -name examples \) -prune | xargs grep "^[ ]*#[ ]*include" | grep ".cpp" | nawk 'FS="\""{split($0, chank); gsub(/.*\//, "", chank[2]); print "find TAO -name", chank[2], "| cpio -pmd /opt/TAO/"}' > install_tao.sh ACE_wrappers> sh ./install_tao.sh ACE_wrappers>
TAOディレクトリ下の拡張子.h、.i、.inlを/opt/TAOにディレクトリ構造を維持してコピーします。
拡張子.hの中において、#include文で拡張子.cppをインクルードしているものがあります。この.cppはヘッダーファイルと同じ扱いをする必要があります。したがって、これらを抜き出してコピーします。
ACE/TAOのライブラリをコピーします。
ACE_wrappers> find . -name "lib*.so.*" | grep -v "tests" | grep -v "examples" | gerp -v "./lib/" | sed 's|\(.*/\)\(lib.*.so\)\(.*\)|cp \1\2\3 /opt/TAO/lib; ln -s ./\2\3 /opt/TAO/lib/\2 |g' > install_lib.sh ACE_wrappers> mkdir /opt/TAO/lib ACE_wrappers> sh install_lib.sh ACE_wrappers>
ACE/TAOのライブラリ群を/opt/TAO/lib直下にコピーします。ライブラリファイルは、拡張子.soの後にバージョン番号が付与されています(例:libACE.so.5.4.8)。これらをコピーした後に、バージョン番号なしのライブラリファイル名をシンボリックリンクとして作成します(例:libACE.so -> ./libACE.so.5.4.8)。これらをコマンドラインで一気に実行する方法が組めなかったので、いったんシェルスクリプトファイルinstall.shを作成しこれを実行しています。
ACE/TAOの実行ファイルをコピーします。
ACE_wrappers> find . -name "*.mpc" -o \( -name tests -o -name performance-tests -o -name examples -o -name DevGuideExamples \) -prune | xargs grep exename | sed 's|\(.*/\).*mpc: *exename *= *\(.*\)|cp \1\2 /opt/TAO/bin|g' > install_bin.sh ACE_wrappers> mkdir /opt/TAO/bin ACE_wrappers> sh install_bin.sh ACE_wrappers>
ACE/TAOの実行ファイルは、UNIXではファイル名規約だけからは判別できないので、ACE/TAOのプロジェクト設定ファイル(*.mpc)に記載されている実行ファイル名を抜き出し、この名前のファイルをコピーするスクリプトファイルを生成し、これを実行します。
したがって、ビルド対象でないファイルをコピーするスクリプトが含まれることがありますが、それによるエラーは無視してください。
MPCツールのコピー
ACE_wrappers> cp bin/m[pw]c.pl /opt/TAO/bin/ ACE_wrappers> cp -r MPC /opt/TAO/ ACE_wrappers> cp -r bin/MakeProjectCreator /opt/TAO/bin/ ACE_wrappers> cp -r TAO/MPC /opt/TAO/TAO/ ACE_wrappers>
bin/mpc.plとMPC/mpc.plは同じファイル名ながら内容が異なっています。ACE/TAOプロジェクト生成時は、bin/mpc.plを使用します。
上記の手順を1つのスクリプトにまとめて記述しました。
ACE/TAOには、テストプログラム群が添付されています。これらを実行してビルドしたACE/TAOの機能確認ができます。
$ACE_ROOT/tests/ディレクトリ下にACEの機能をテストするプログラムが置かれています。これらをビルドして実行します。
ACE_wrappers$ cd tests tests$ gmake -i : tests$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. tests$ ./run_test.pl | tee run_test_result.txt auto_run_tests: tests/ACE_Test auto_run_tests_finished: test/ACE_Test Time:0s Result:0 auto_run_tests: tests/Arg_Shifter_Test auto_run_tests_finished: test/Arg_Shifter_Test Time:0s Result:0 auto_run_tests: tests/Array_Map_Test : tests$
各テストにResult:0のように結果が表示されます。0は成功のようなので、0以外のものがないか確認します。今回ビルドした環境では、以下のテストがエラーになっていました。
auto_run_tests: tests/Proactor_Test auto_run_tests_finished: test/Proactor_Test Time:404s Result:-1
CC -D_POSIX_PTHREAD_SEMANTICS -mt -m64 -DACE_HAS_KSTAT -g -DACE_HAS_KSTAT -library=stlport4 -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 -I/home/toru/work/ACE+TAO/ACE_wrappers -DACE_HAS_SCTP -DACE_HAS_LKSCTP -D__ACE_INLINE__ -DACE_HAS_STLPORT -I.. -c -o .obj/Compiler_Features_10_Test.o Compiler_Features_10_Test.cpp "Compiler_Features_10_Test.cpp", 行 95: エラー: const char* から std::runtime_error にキャストできません. 1 個のエラーが検出されました. gmake[1]: *** [.obj/Compiler_Features_10_Test.o] Error 2 gmake[1]: Leaving directory `/home/torutk/work/ACE+TAO/ACE_wrappers/tests' gmake: *** [Compiler_Features_10_Test] Error 2
95 throw std::runtime_error("requested exception");
auto_run_tests_finished: tests/Bug_2740_Regression_Test Time:319s Result:-1 auto_run_tests_finished: tests/Proactor_Test Time:319s Result:-1 auto_run_tests_finished: tests/Proactor_UDP_Test Time:319s Result:-1 auto_run_tests_finished: tests/Reactor_Fairness_Test Time:91s Result:2 auto_run_tests_finished: tests/Service_Config_Stream_Test Time:2s Result:255 auto_run_tests_finished: tests/Proactor_Test_IPV6 Time:318s Result:-1
work$ PATH=$PATH:/opt/TAO/bin work$ export ACE_ROOT=/opt/TAO work$ export TAO_ROOT=/opt/TAO/TAO work$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/TAO/lib work$
ACEライブラリを使用するプログラムを作成し、ビルド・実行します。
// hello_ace.cc #include <ace/OS.h> int main(int argc, char* argv[]) { ACE_OS::printf("Hello, ACE World!\n"); } |
MPCツール用の設定ファイルを作成し、GNU make用のメイクファイルを生成します。今回は、ワークスペースは作成せずプロジェクトファイル1つだけを作成します。
project(Hello) : aceexe { exename = hello_ace Source_Files { hello_ace.cc } } |
mpc.plコマンドを実行し、GNU make用メイクファイルを生成します。
hello$ mpc.pl -type gnuace Hello.mpc Using .../opt/TAO/bin/MakeProjectCreator/config/MPC.cfg CIAO_ROOT was used in the configuration file, but was not defined. DANCE_ROOT was used in the configuration file, but was not defined. 'dynamic_types' directory /opt/TAO/TAO/MPC not found. Generating 'gnuace' output using hello.mpc Generation Time: 0s hello$ ls GNUmakefile.Hello hello_ace.cc Hello.mpc hello$
hello$ gmaek -f GNUmakefile.Hello touch .depend.Hello GNUmakefile: /home/torutk/work/hello/GNUmakefile.Hello MAKEFLAGS= CC -D_POSIX_PTHREAD_SEMANTICS -mt -DACE_HAS_KSTAT -g -DACE_HAS_KSTAT \ -library=stlport4 -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 \ -I/opt/TAO -DACE_HAS_SCTP -DACE_HAS_LKSCTP -DACE_HAS_EXCEPTIONS \ -D__ACE_INLINE__ -DACE_HAS_STLPORT -I/opt/TAO -c -o .obj/hello_ace.o \ hello_ace.cc CC -D_POSIX_PTHREAD_SEMANTICS -mt -DACE_HAS_KSTAT -g -DACE_HAS_KSTAT \ -library=stlport4 -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 \ -I/opt/TAO -DACE_HAS_SCTP -DACE_HAS_LKSCTP -DACE_HAS_EXCEPTIONS \ -D__ACE_INLINE__ -DACE_HAS_STLPORT -I/opt/TAO -mt -z now -xannotate=no \ -xildoff -L/opt/TAO/lib -library=stlport4 -L. -L/opt/TAO/lib -o hello_ace \ .obj/hello_ace.o -lACE -lsendfile -lkstat -lsocket -lrt -laio -ldl -lnsl -lgen \ -lposix4 -ladm -lsctp hello$
hello$ ./hello_ace Hello, ACE World! hello$
TAOライブラリを使用するプログラムを作成し、ビルド・実行します。
CORBAを利用するプログラムは、クライアントとサーバと2種類があります。このクライアントとサーバ間での通信をIDLで定義します。
interface Hello { string get_greeting(); }; |
// hello_server.h #include "helloS.h" class HelloImpl : public virtual POA_Hello { public: virtual char* get_greeting() throw (CORBA::SystemException); }; |
#include "hello_server.h" #include <iostream> char* HelloImpl::get_greeting() throw (CORBA::SystemException) { return "Hello, CORBA TAO"; } int main(int argc, char* argv[]) { try { CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); PortableServer::POAManager_var manager = poa->the_POAManager(); manager->activate(); HelloImpl hello_servant; Hello_var hello = hello_servant._this(); CORBA::String_var ior_string = orb->object_to_string(hello.in()); std::cout << ior_string.in() << std::endl; orb->run(); } catch (const CORBA::Exception& e) { std::cerr << "Uncaught CORBA exception" << std::endl; return 1; } return 0; } |
#include "helloC.h" #include <iostream> int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage:" << argv[0] << " IOR_string" << std::endl; throw 0; } CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); CORBA::Object_var obj = orb->string_to_object(argv[1]); if (CORBA::is_nil(obj.in())) { std::cerr << "Nil Hello Reference" << std::endl; throw 0; } Hello_var hello = Hello::_narrow(obj.in()); if (CORBA::is_nil(hello.in())) { std::cerr << "Argument is not a Hello reference" << std::endl; throw 0; } { std::cout << "Validating connection" << std::endl; CORBA::PolicyList_var policies; hello->_validate_connection(policies.out()); std::cout << "Successfull" << std::endl; } char* greeting = hello->get_greeting(); std::cout << "Hello server: " << greeting << std::endl; } catch (const CORBA::Exception& e) { ACE_PRINT_EXCEPTION(e, "Who is the culprit\n"); std::cerr << "Uncaught CORBA exception" << std::endl; return 1; } return 0; } |
MPCツール用の設定ファイルを作成し、GNU make用のメイクファイルを生成します。今回は、ワークスペースは作成せずプロジェクトファイル1つだけを作成します。
project(*server): taoserver { Source_Files { hello_server.cpp } } project(*client): taoclient { Source_Files { hello_client.cpp } Source_Files { helloC.cpp } } |
mpc.plコマンドを実行し、GNU make用メイクファイルを生成します。
hello$ mpc.pl -type gnuace hello.mpc Using .../opt/TAO/bin/MakeProjectCreator/config/MPC.cfg CIAO_ROOT was used in the configuration file, but was not defined. DANCE_ROOT was used in the configuration file, but was not defined. Generating 'gnuace' output using hello.mpc Generation Time: 0s hello$ ls GNUmakefile.hello_client GNUmakefile.hello_server hello.idl hello.mpc hello_client.cpp hello_server.cpp hello_server.h hello$
サーバ・プログラムのコンパイル・リンクを行います。
hello$ gmake -f GNUmakefile.hello_server touch .depend.hello_server GNUmakefile: /home/torutk/work/hello/GNUmakefile.hello_server MAKEFLAGS= /opt/TAO/bin/tao_idl -Wb,pre_include=ace/pre.h -Wb,post_include=ace/post.h \ -I/opt/TAO/TAO -Sa -St hello.idl processing hello.idl CC -D_POSIX_PTHREAD_SEMANTICS -mt -DACE_HAS_KSTAT -g -DACE_HAS_KSTAT \ -library=stlport4 -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 \ -I/opt/TAO -DACE_HAS_SCTP -DACE_HAS_LKSCTP -DACE_HAS_EXCEPTIONS \ -D__ACE_INLINE__ -DACE_HAS_STLPORT -I/opt/TAO -I/opt/TAO/TAO \ -c -o .obj/helloC.o helloC.cpp CC -D_POSIX_PTHREAD_SEMANTICS -mt -DACE_HAS_KSTAT -g -DACE_HAS_KSTAT \ -library=stlport4 -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 \ -I/opt/TAO -DACE_HAS_SCTP -DACE_HAS_LKSCTP -DACE_HAS_EXCEPTIONS \ -D__ACE_INLINE__ -DACE_HAS_STLPORT -I/opt/TAO -I/opt/TAO/TAO -c \ -o .obj/helloS.o helloS.cpp CC -D_POSIX_PTHREAD_SEMANTICS -mt -DACE_HAS_KSTAT -g -DACE_HAS_KSTAT \ -library=stlport4 -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 \ -I/opt/TAO -DACE_HAS_SCTP -DACE_HAS_LKSCTP -DACE_HAS_EXCEPTIONS \ -D__ACE_INLINE__ -DACE_HAS_STLPORT -I/opt/TAO -I/opt/TAO/TAO -c \ -o .obj/hello_server.o hello_server.cpp "hello_server.cpp", 行 6: 警告: 初期設定で文字列リテラルを char* に変換しました. 1 個の警告が検出されました. CC -D_POSIX_PTHREAD_SEMANTICS -mt -DACE_HAS_KSTAT -g -DACE_HAS_KSTAT \ -library=stlport4 -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 \ -I/opt/TAO -DACE_HAS_SCTP -DACE_HAS_LKSCTP -DACE_HAS_EXCEPTIONS \ -D__ACE_INLINE__ -DACE_HAS_STLPORT -I/opt/TAO -I/opt/TAO/TAO -mt -z now \ -xannotate=no -xildoff -L/opt/TAO/lib -library=stlport4 -L. \ -L/opt/TAO/lib -o server .obj/helloC.o .obj/helloS.o .obj/hello_server.o \ -lTAO_PortableServer -lTAO_AnyTypeCode -lTAO -lACE -lsendfile -lkstat \ -lsocket -lrt -laio -ldl -lnsl -lgen -lposix4 -ladm -lsctp hello$
IDLコンパイラを呼び出して、IDLファイルからスタブ、スケルトンファイルも生成いています。
続いてクライアント・プログラムのコンパイル・リンクを行います。
hello$ gmaek -f GNUmakefile.hello_client touch .depend.hello_client GNUmakefile: /home/torutk/work/hello/GNUmakefile.hello_client MAKEFLAGS= CC -D_POSIX_PTHREAD_SEMANTICS -mt -DACE_HAS_KSTAT -g -DACE_HAS_KSTAT \ -library=stlport4 -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 \ -I/opt/TAO -DACE_HAS_SCTP -DACE_HAS_LKSCTP -DACE_HAS_EXCEPTIONS \ -D__ACE_INLINE__ -DACE_HAS_STLPORT -I/opt/TAO -I/opt/TAO/TAO -c \ -o .obj/hello_client.o hello_client.cpp CC -D_POSIX_PTHREAD_SEMANTICS -mt -DACE_HAS_KSTAT -g -DACE_HAS_KSTAT \ -library=stlport4 -DSUN_CC_HAS_PVFC_BUG -DACE_HAS_CUSTOM_EXPORT_MACROS=0 \ -I/opt/TAO -DACE_HAS_SCTP -DACE_HAS_LKSCTP -DACE_HAS_EXCEPTIONS \ -D__ACE_INLINE__ -DACE_HAS_STLPORT -I/opt/TAO -I/opt/TAO/TAO -mt -z now \ -xannotate=no -xildoff -L/opt/TAO/lib -library=stlport4 -L. \ -L/opt/TAO/lib -o client .obj/helloC.o .obj/helloS.o .obj/hello_client.o \ -lTAO -lACE -lsendfile -lkstat -lsocket -lrt -laio -ldl -lnsl \ -lgen -lposix4 -ladm -lsctp hello$
hello$ ./server IOR:010000000e00000049444c3a48656c6c6f3a312e300000000200000000000000640000000101 020006000000736f6c61720054821b00000014010f005253546d41544c3250060000000000010000 00010000000002000000000000000800000001000000004f41540100000018000000010000000100 010001000000010001050901010000000000000000006400000001010200040000003a3a31005482 54821b00000014010f005253546d41544c3250060000000000010000000100000000020000000000 00000800000001000000004f41540100000018000000010000000100010001000000010001050901 010000000000 hello$
サーバは実行すると、標準出力にIOR情報を出力します。クライアント実行時にコマンドライン引数にこのIOR情報(文字列)を指定するので、コピーしておきます。
hello$ ./client IOR:010000000e00000049444c3a48656c6c6f3a312e30000000020000000000 0000640000000101020006000000736f6c61720054821b00000014010f005253546d41544c325006 000000000001000000010000000002000000000000000800000001000000004f4154010000001800 00000100000001000100010000000100010509010100000000000000000064000000010102000400 00003a3a3100548254821b00000014010f005253546d41544c325006000000000001000000010000 000002000000000000000800000001000000004f4154010000001800000001000000010001000100 0000010001050901010000000000 Validating connection Successfull Hello server: Hello, CORBA TAO hello$