例 2. IPA 制御ファイルの使用
以下の例は、UserInterface.C からどの関数をエクスポートするかを IPA 制御ファイルを使って選択します。この方法では、EXPORTALL オプションを使わずに IPA コンパイル・ステップを実行することができます。最初のステップは、IPA 制御ファイルの作成です。 IPA 制御ファイルに表示される関数名は、ソース・ファイル内の関数名がコンパイラーによってマングルされる場合、マングル名でなければなりません。 ファイルの内容は次のとおりです。
export=get_user_input__7UIclassFv,
get_user_sort_method__7UIclassFRi,
call_user_sort_method__7UIclassFi,
print_sort_result__7UIclassFv
例で使用される名前と SCCNSAM データ・セットのメンバーとのマッピングについて は、例 1. C と C++ の混在の該当するセクションを参照してください。
z/OS® UNIX システム・サービスでの例 2 の作成
まず、IPA は以下のコマンドを使って個々のソース・ファイルをコンパイルしな ければなりません。
c89 -c -2 -WI -Wc,"FLAG(I),DLL" c_DLL.c
c++ -c -2 -WI -Wc,"FLAG(I)" -+ cpp_DLL.C
c++ -c -2 -WI -Wc,"FLAG(I)" -+ UserInterface.C
xlc ユーティリティーを使用している場合、以下のコマンド行 により、同じ IPA コンパイルが起動されます。
c89 -c -O2 -qipa -qflag=i -qdll c_DLL.c
c++ -c -O2 -qipa -qflag=i -+ cpp_DLL.C
c++ -c -O2 -qipa -qflag=i -+ UserInterface.C
次に、制御ファイルを指定するために IPA リンク・ステップを実行します。
c++ -2 -WI,"LEVEL(1),CONTROL(mydll.cntl)" -Wl,I,DLL -Wl,DLL -o mydll
UserInterface.o c_DLL.o cpp_DLL.o
xlc ユーティリティーを使用している場合、以下のコマンド行 により、同じ IPA リンクが起動されます。
c++ -O2 -qipa=level=1 -qipa=control=mydll.cntl -qdll -Wl,DLL -o mydll
UserInterface.o c_DLL.o cpp_DLL.o
これで、指定された関数だけが UserInterface.C からエクスポート される DLL が作成されます。
バッチでの例 2 の作成
//USERID1A JOB (127A,0329),'$MEM$',
// MSGLEVEL=(2,0),MSGCLASS=S,CLASS=A,
// NOTIFY=USERID1,REGION=1024M
//PROC JCLLIB ORDER=(CBC.SCCNPRC)
//*--------------------------------------------------------------------
//* IPA compile step for CDLL
//*--------------------------------------------------------------------
//C001F336 EXEC EDCC,
// INFILE='USERID1.IPA.SOURCE(CDLL)',
// OUTFILE='USERID1.IPA.OBJECT(CDLL),DISP=SHR',
// CPARM='OPTFILE(DD:OPTIONS)'
//OPTIONS DD *
IPA(NOOBJECT) RENT LONG OPT(2) DLL
LSEARCH('USERID1.IPA.+')
SEARCH('CEE.SCEEH.+')
/*
//*--------------------------------------------------------------------
//* IPA compile step for CPPDLL
//*--------------------------------------------------------------------
//C001F336 EXEC CBCC,
// INFILE='USERID1.IPA.SOURCE(CPPDLL)',
// OUTFILE='USERID1.IPA.OBJECT(CPPDLL),DISP=SHR',
// CPARM='OPTFILE(DD:OPTIONS)'
//OPTIONS DD *
IPA(NOOBJECT) OPT(2)
LSEARCH('USERID1.IPA.+')
SEARCH('CEE.SCEEH.+')
/*
//*--------------------------------------------------------------------
//* IPA compile step for USERINT
//*--------------------------------------------------------------------
//C001F336 EXEC CBCC,
// INFILE='USERID1.IPA.SOURCE(USERINT)',
// OUTFILE='USERID1.IPA.OBJECT(USERINT),DISP=SHR',
// CPARM='OPTFILE(DD:OPTIONS)'
//OPTIONS DD *
IPA(NOOBJECT) OPT(2)
LSEARCH('USERID1.IPA.+')
SEARCH('CEE.SCEEH.+')
/*
//*--------------------------------------------------------------------
//* IPA link step for the hello module
//*--------------------------------------------------------------------
//C001F336 EXEC CBCI,
// OUTFILE='USERID1.IPALINK.OBJECT(MYDLL),DISP=SHR',
// IPARM='OPTFILE(DD:OPTIONS)'
//* The following line sets up an input file that just includes all
//* the IPA compile step object files.
//SYSIN DD DATA,DLM='/>'
INCLUDE OBJECT(USERINT,CDLL,CPPDLL)
INCLUDE SYSLIB(C128,IOSTREAM,COMPLEX)
/>
//* These are the options used
//OPTIONS DD DATA,DLM='/>'
IPA(LINK,LEVEL(1),CONTROL('USERID1.ipa.cntl(dllex)'))
OPT(2) RENT LONGNAME
/>
//* The following line gives the object library
//OBJECT DD DSN=USERID1.IPA.OBJECT,DISP=SHR
結果のオブジェクト・デック (MYDLL) には、#pragma export を使って明示的にエ クスポートされる関数と、制御ファイルで指定された 4 つの関数だけがエクスポー トされます。