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

TAO1.8 Solaris 10 x86 SunStudio 12u1インストール記録

Solaris上のコンパイラ環境

Solaris環境では、主に次の2つのコンパイラが利用されています。

  1. Sun製コンパイラ
    製品名称がころころと変わっています。Sun WorkShop C++、Forte Developer C++、Sun ONE Studio C++、Sun Studio C++といった名称が該当します。かなり高価でしたが、SunStudio11から無償となりました。
  2. GCC:GNUコンパイラ・コレクション
    Solaris 10では、OSインストールにGCCが含まれるようになりました。
    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 5.8.0)

ACE+TAO-5.8.0は、Sun Studio 12u1でビルドするとエラーが発生するため、一部修正が必要なファイルがあります。

ACE_wrappers/include/makeinclude/platform_sunos5_sunc++.GNU

コンパイラ・バージョン情報取得方法

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

64bitコンパイル時、Solaris Studio 12.2 以降のコンパイルフラグが正しく指定されない

コンパイラの各バージョン決め打ちにコンパイルフラグを指定しているため、新しいコンパイラバージョンに対応していない。

            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

ACE_wrappers/ace/config-sunos5.5.h

--- 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進数値の表現が変更されました。そのため、バージョンを判定して取得方法を修正しました。

ビルドの実施記録

1. config.hの編集

$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.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

2. platform_macros.GNU

$HOME/work/ACE_wrapers/include/makeinclude/platform_macros.GNU ファイルを新規に作成します。

ACE_wrappers/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
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

使用するスレッドAPIの設定

Solaris OSは、2つの種類のスレッドAPIが利用できます。1つは、旧来からのSolarisスレッドAPI、そしてもう1つはPOSIXスレッドAPIです。ACE/TAOではデフォルトでは両方のスレッドAPIを使用可能としていますが、以下の定義を追加することによってPOSIXスレッドだけに限定することができます。

CFLAGS += -D_POSIX_PTHREAD_SEMANTICS

3. コンパイル・リンク

環境変数の設定

環境変数ACE_ROOT
ACE_wrappers$ export ACE_ROOT=`pwd`
ACE_wrappers$ echo $ACE_ROOT
/export/home/torutk/work/ACE_wrappers
ACE_wrappers$
環境変数TAO_ROOT
ACE_wrappers$ export TAO_ROOT=$ACE_ROOT/TAO
ACE_wrappers$ echo $TAO_ROOT
/export/home/torutk/work/ACE_wrappers/TAO
ACE_wrappers$
環境変数LD_LIBRARY_PATH
ACE_wrappers$ export LD_LIBRARY_PATH=$ACE_ROOT/ace:$LD_LIBRARY_PATH
ACE_wrappers$
環境変数SSL_ROOT (オプション)

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$ 
環境変数PATH

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$ 

ACE+TAOのビルドファイル

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

という記述があります。

ACE、TAOのビルド

ビルドは、TAOディレクトリで実行します。

TAO$ gmake 2>&1 | tee make.log
 :
TAO$ 

処理時間目安:AMD Phenom 9750で2時間20分

デフォルトではビルドする対象が多いので、不要なサービスはビルドしないようにするとよいかもしれません。

SunStudio 12u1, 64bitでのコンパイル・リンクオプション

コンパイルオプション

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

4. インストール

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/TAOの機能確認ができます。

ACE tests

$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 

ACE+TAO+CIAO-5.8.2/Solaris 10(9/10)/Solaris Studio 12.2/64bitでのエラー

コンパイル・リンクエラー
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

ACE/TAOプログラムのビルドと実行

はじめに、環境設定

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$

HelloACEプログラム

ACEライブラリを使用するプログラムを作成し、ビルド・実行します。

HelloACEソースファイル

hello_ace.cc
// hello_ace.cc
#include <ace/OS.h>

int main(int argc, char* argv[])
{
    ACE_OS::printf("Hello, ACE World!\n");
}

HelloACEプロジェクト設定ファイル

MPCツール用の設定ファイルを作成し、GNU make用のメイクファイルを生成します。今回は、ワークスペースは作成せずプロジェクトファイル1つだけを作成します。

Hello.mpc
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$
注記1
mpcファイルを指定せずにmpc.plコマンドを実行すると、カレントディレクトリに存在するソースファイルをもとに、ディレクトリ名を接尾子にしたGNUmakefile.helloを生成してしまいます。しかしそれは不十分なものになっているので要注意。

HelloACEのコンパイル・リンク

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$

HelloACEの実行

hello$ ./hello_ace
Hello, ACE World!
hello$

HelloTAOプログラム

TAOライブラリを使用するプログラムを作成し、ビルド・実行します。

HelloTAOソースファイル

CORBAを利用するプログラムは、クライアントとサーバと2種類があります。このクライアントとサーバ間での通信をIDLで定義します。

hello.idl
interface Hello {
    string get_greeting();
};
サーバ・プログラムのソースコード
hello_server.h
// hello_server.h
#include "helloS.h"

class HelloImpl : public virtual POA_Hello
{
public:
    virtual char* get_greeting() throw (CORBA::SystemException);
};
hello_server.cpp
#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;
}
クライアント・プログラムのソースコード
hello_client.cpp
#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;
}

Hello TAOプロジェクト設定ファイル

MPCツール用の設定ファイルを作成し、GNU make用のメイクファイルを生成します。今回は、ワークスペースは作成せずプロジェクトファイル1つだけを作成します。

hello.mpc
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$

HelloTAOのコンパイル・リンク

サーバ・プログラムのコンパイル・リンクを行います。

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$

HelloTAOの実行

サーバの実行
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$