例 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 つの関数だけがエクスポー トされます。