■C言語/C++言語の場合
サーバのメソッド部をIDLファイルのインタフェース定義単位で分割し、ライブラリ化する場合、以下の点に注意してください。
1つのモジュール内に1つのインタフェースが定義されている場合を例に説明します。
module M { interface I1 { ... }; };
(1) IDLファイルのコンパイル
IDLファイルをコンパイルしてスタブ・スケルトンを生成する場合、以下のオプションを指定する必要があります。
IDLc -dy X.idl
IDLc -dy -cpp X.idl
-dyオプションを指定することで、IDLファイルに定義されたインタフェースごとにスケルトンを生成します。ライブラリは、生成されたスケルトンファイルごとに作成します。
(2) アプリケーションコンパイル時の手順
IDLファイルから生成されたスケルトンをコンパイルして*.oファイルを作成した後、Cコンパイラのライブラリ作成オプション(-Gなど)を指定することで、ライブラリを作成します。
cc -I$OD_HOME/include -D_REENTRANT -DNeedFunctionPrototypes -lsocket -lnsl -lthread -L$OD_HOME/lib -lOM -o X_M_I1_skel.o -c X_M_I1_skel.c cc -G -Kpic -I$OD_HOME/include -D_REENTRANT -DNeedFunctionPrototypes -lsocket -lnsl -lthread -L$OD_HOME/lib -lOM -o libM_I1.so X_M_I1_skel.o
gcc -I$OD_HOME/include -D_REENTRANT -DNeedFunctionPrototypes -Wl -E -lnsl -lpthread -L$OD_HOME/lib -lOM -o X_M_I1_skel.o -c X_M_I1_skel.c gcc -shared -fPIC -I$OD_HOME/include -D_REENTRANT -DNeedFunctionPrototypes -Wl -E -lnsl -lpthread -L$OD_HOME/lib -lOM -o libM_I1.so X_M_I1_skel.o
(3) OD_impl_instでの登録
IDLファイルから作成したライブラリをOD_impl_instコマンドの定義ファイルで指定します。
OD_impl_inst -ax X_def
X_def:定義ファイル
定義ファイルX_defに“IDL:M/I1:1.0 = /user/libM_I1.so”を指定することにより、実際にクライアントからの要求時に/user/libM_I1.soが読み込まれ、サーバメソッドが呼び出されます。
(4) 継承を使用する場合のOD_impl_instでの登録
継承機能を使用する場合は、OD_impl_instコマンドの定義ファイルに以下を指定します。
例
モジュール名:M、インタフェース名:I1、継承名:I2の場合
IDL:M/I1:1.0 = /user/lib/libM_I1.so IDL:M/I2:1.0 = /user/lib/libM_I2.so,,IDL:M/I1:1.0
■COBOLの場合
サーバのメソッド部をIDLファイルのインタフェース定義単位で分割し、ライブラリ化する必要があります。このとき、以下の点に注意してください。
1つのモジュール内に1つのインタフェースが定義されている場合を例に説明します。
module M { interface I1 { ... }; };
(1) IDLファイルのコンパイル
IDLファイルをコンパイルしてスタブ/スケルトンを生成する場合、以下のオプションを指定する必要があります。
IDLc -cobol IDLファイル名
(2) アプリケーションコンパイル時の手順
IDLファイルから生成されたスケルトンをコンパイルして*.oファイルを作成した後、COBOLコンパイラのライブラリ作成オプション(-Gなど)を指定することで、ライブラリを作成します。
cobol -G -o libX_cdr.so X_cdr.cbl cobol -G -o libX_skel.so X_skel.cbl cobol -G -o libX_M_I1_skel.so X_M_I1_skel.cbl cobol -G -lcobol -L$OD_HOME/lib -lOMcbl -o libM-I1.so -lX_cdr -lX_skel -lX_M_I1_skel M_I1.cbl
注意
環境変数LD_LIBRARY_PATHに、COBOLのランタイムlibcobol.soの格納ディレクトリおよびアプリケーション作成時のカレントディレクトリを指定する必要があります。
本製品の提供する登録集を参照するため、あらかじめ環境変数CORBAに以下を設定すると、COBOLソースのコンパイルが容易になります。
CORBA = $OD_HOME/include/COBOL
COBOLのサーバアプリケーションは、ライブラリの形態で利用されます。ライブラリの名称は、以下のとおりです。ライブラリファイル名のモジュール名とインタフェース名部分は、IDL定義の内容にかかわらず大文字となります。
libモジュール名-インタフェース名.so
作成するライブラリを構成するモジュールを以下に示します(IDLファイル:X.idl)。
libX_cdr.so libX_skel.so libX_MM_I1_skel.so
また、ユーザ作成のサーバ実装部から他の関数をCALLする場合、同様にライブラリ化し、環境変数LD_LIBRARY_PATHなどに設定する必要があります。詳細については、COBOLのマニュアルを参照してください。
COBOLソースコンパイル時に“-dy”オプションを指定しないでください。
(3) OD_impl_instでの登録
IDLファイルから作成したライブラリをOD_impl_instコマンドの定義ファイルで指定します。
OD_impl_inst -ax X_def (X_def:定義ファイル)
定義ファイルX_defに“IDL:M/I1:1.0=/user/libM-I1.so”を指定することにより、実際にクライアントからの要求時に/user/libM-I1.soが読み込まれ、サーバメソッドが呼び出されます。
注意
定義ファイルに指定するライブラリのファイル名には、“アプリケーションコンパイル時の手順”で作成したライブラリのファイル名を指定してください。このとき、大文字小文字も一致させてください。
(4) 継承を使用する場合のOD_impl_instでの登録
継承機能を使用する場合、OD_impl_instコマンドの定義ファイルに以下を指定します。
例
モジュール名:M、インタフェース名:I1、継承名:I2の場合
IDL:M/I1:1.0 = /user/lib/libM-I1.so IDL:M/I2:1.0 = /user/lib/libM-I2.so,,IDL:M/I1:1.0
(5) COBOLでの“IDL:BAD_OPERATION:1.0”の発生条件について
以下にシステム例外として“IDL:BAD_OPERATION:1.0”が通知された場合のサーバアプリケーションの見直しのポイントを示します。
アプリケーションの誤り
存在しない関数を使用
ライブラリの作成時に存在しない関数を誤ってCALLしている場合、未決シンボルが残ったままでライブラリができます。通常、他のライブラリにより未決シンボルが解決されますが、アプリケーション動作時に解決がされない場合、サーバアプリケーションのメソッド呼出しに失敗して、BAD_OPERATIONが通知されます。
COBOLコンパイルの指定方法誤り
コンパイルオプションの指定誤り
COBOLソースのコンパイル時に“-dy”が指定された場合、“-dy”指定で作成されたアプリケーションからlibOMcbl.so/libOMircbl.soが提供するObjectDirectorの各サービス関数が使用できず、COBOLランタイムから以下のメッセージが表示されてサーバアプリケーションの各関数呼出しに失敗し、BAD_OPERATIONが通知されます。
例) libXXXX.soが見つかりません。
(XXXX:ObjectDirectorの関数名)
OD_impl_instコマンドで指定した定義ファイルに記述したサーバメソッド用ライブラリを作成する際にIDLコンパイラから生成された以下のCOBOLソースから作成したライブラリが結合されていない場合、BAD_OPERATIONが通知されます。
IDLファイル名_インタフェース名_skel.so
IDLファイル名_cdr.so
IDLファイル名_skel.so(struct,unionなどの領域獲得関数用ソース)
環境設定の誤り
インプリメンテーション情報登録の誤り
OD_impl_instコマンドで指定する定義ファイルの記述に以下の誤りがあり、サーバアプリケーションのメソッド呼出しに失敗し、BAD_OPERATIONが通知されます。
定義ファイルに記述するリポジトリID(rep_id)がIDLと一致していません。
persistent以外の場合で、環境変数定義(env)に環境変数LD_LIBRARY_PATHが設定されていません。または、COBOLランタイム/サーバアプリケーションの格納先、サーバアプリケーション/メソッドのライブラリの検索パスが定義されていません。
継承するライブラリの定義が漏れています。
リポジトリIDとライブラリの対応付けに誤りがあります。
IDL:module/interface:1.0 = ライブラリ名
アプリケーション起動時の環境変数LD_LIBRARY_PATHの設定誤り
環境変数LD_LIBRARY_PATHに、サーバアプリケーションの格納先、サーバアプリケーション/メソッドのライブラリが定義されていません。
スレッド用libOM.soが有効となっている場合、サーバアプリケーションの起動/メソッドの呼出しに失敗します。COBOL使用時は、以下のパスを指定する必要があります。
$OD_HOME/lib/nt