OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (上巻)


前へ 次へ 目次 索引


1.3 VAX システムでの RTL リンク・オプション (VAX only)

VAX C RTL と HP C RTL はどちらも OpenVMS VAX システムに共存できます。 VAX C RTL は既存の VAX C アプリケーションをサポートします。 HP C RTL は ANSI 準拠の HP C と HP C++ をサポートし,OpenVMS 環境の他のコンポーネントもサポートします。 HP C RTL では,スレッド・セーフと性能向上のための機能も提供されます。

VAX C で開発されたアプリケーションは,今後も VAX C RTL を使用します。しかし,代わりに HP C RTL を使用するように VAX C アプリケーションを再リンクすることもできます。このようにすると, HP C RTL の新機能を利用することができ, VAX C RTL と HP C RTL の両方を統合した複雑なアプリケーションで相互運用性に関する問題を解決することができます。 HP C RTL を使用するために再リンクされる既存のアプリケーションは, VAX C RTL と HP C RTL の動作の違いによって問題が発生しないかどうか,注意深くテストしておく必要があります。詳細については,該当する HP C のリリース・ノートと OpenVMS のリリース・ノートを参照してください。

ここでは,OpenVMS VAX システムで HP C プログラムを HP C RTL および VAX C RTL とリンクするための複数の方法について説明します。

1.3.1 HP C RTL とのリンク

HP C RTL では, VAX C RTL ファイルとは名前の異なる新しいファイルが提供されます。 HP C RTL とリンクする場合は,新しいファイル名を使用するようにリンク・プロシージャを変更する必要があります。ここでは, HP C RTL ファイルとのリンクについて説明します。

1.3.1.1 HP C RTL 共用可能イメージとのリンク

ほとんどのリンクでは,SYS$LIBRARY ディレクトリ内の HP C RTL 共用可能イメージ DECC$SHR.EXE を使用します。 HP C や HP C++ コードで作成されたプログラム,つまり VAX C オブジェクト・モジュールを含まないプログラムの場合は,このリンク方式を使用してください。

DECC$SHR.EXE は接頭語の付いているユニバーサル・シンボル (DECC$ から始まるシンボル) だけをエクスポートするので,正しくリンクするには,すべての HP C RTL エントリ・ポイントに対して接頭語を付ける必要があります。

ANSI C 標準で定義されている HP C RTL 関数だけを使用する場合は,すべてのエントリ・ポイントに接頭語が付加されます。

ANSI C 標準に定義されていない HP C RTL 関数を使用する場合は,次のいずれかの方法でコンパイルして接頭語を付けるようにしなければなりません。

その後,LINK コマンドを使用して,共用可能イメージに対してリンクします。次の例を参照してください。


$ LINK PROG1

VAX C コンパイラを使用し,DECC$SHR.EXE とリンクする場合は,次のいずれかのファイルにリンクする必要があります。

VAXC2DECC.EXE
VAXCG2DECC.EXE

次のようにこれらのファイルとリンクします。


$ LINK PROG1,TT:/OPTIONS
SYS$LIBRARY:VAXC2DECC/SHARE
[Ctrl/Z]

/G_FLOAT または /FLOAT=G_FLOAT 修飾子を使用してコンパイルした場合は, G-floating バージョンである VAXCG2DECC.EXE を使用します。

1.3.1.2 独自の共用可能イメージとのリンクまたはその提供

共用可能イメージを使用するアプリケーションをリンクする場合,共用可能イメージで HP C ,VAX C,あるいは他のプログラミング言語を使用しているかどうかとは無関係に,ほとんどの場合,単純なリンク・コマンドを使用することができます。

たとえば,SHARE1.EXE が VAXCRTL.EXE とリンクされている共用可能イメージであるとしましょう。また,プログラム PROG1 が HP C を使用してコンパイルされており,したがって,C RTL 関数に対して接頭語の付いた名前を参照するとしましょう。この場合,次のコマンドを使用できます。


    $ LINK PROG1, SYS$INPUT:/OPTIONS    
    MYDISK:[TEXT]SHARE1.EXE/SHARE 

PROG1 で接頭語の付いた名前を使用しない場合,リンクでリンクの競合が発生する可能性があります。その場合は, 第 1.3.2 項 を参照してください。

1.3.1.3 HP C RTL オブジェクト・ライブラリとのリンク

HP C RTL オブジェクト・ライブラリは主に, /NOSYSSHR 修飾子を使用してリンクする場合に使用します。

OpenVMS VAX システムでは, HP C RTL は SYS$LIBRARY ディレクトリに次のオブジェクト・ライブラリを提供します。

VAX C の場合と同様に, LINK コマンドに複数のオブジェクト・ライブラリを指定する場合は,ここに示した順に指定する必要があります。

これらのオブジェクト・ライブラリは, VAX C RTL オブジェクト・ライブラリ VAXCRTL.OLB, VAXCRTLG.OLB,VAXCCURSE.OLB を使用する場合と同じ方法で使用します。次の例を参照してください。


$ ! Link a D-float program
$ LINK PROG1, SYS$LIBRARY:DECCRTL.OLB/LIBRARY
$ !
$ ! Link a G-float program
$ LINK PROG2, SYS$LIBRARY:DECCRTLG.OLB/LIBRARY, - 
_$ SYS$LIBRARY:DECCRTL.OLB/LIBRARY
$ !
$ ! Link a D-float, Curses program
$ LINK PROG1, SYS$LIBRARY:DECCCURSE.OLB/LIBRARY, - 
_$ SYS$LIBRARY:DECCRTL.OLB/LIBRARY

注意

HP C RTL オブジェクト・ライブラリにリンクする場合は, LNK$LIBRARY 論理名を定義する必要はありません。実際には,.OLB ライブラリとリンクするときに, LNK$LIBRARY の割り当てを解除する必要があります。解除しないと,"multiply defined symbols" エラーが発生します。

一般に,LNK$LIBRARY 論理名が HP C RTL オブジェクト・ライブラリを指すように設定すると,VAX C の開発に不都合が生じるため, LNK$LIBRARY の割り当ては解除する必要があります。

1.3.1.4 /NOSYSSHR を使用した HP C RTL オブジェクト・ライブラリとのリンク

/NOSYSSHR 修飾子を使用して HP C RTL オブジェクト・ライブラリとプログラムをリンクする場合は,オブジェクト・ライブラリに対して /INCLUDE=CMA$TIS を指定する必要があります。 OpenVMS VAX バージョン 7.3 以降では, /INCLUDE=(CMA$TIS,CMA$TIS_VEC) を指定する必要があります。指定しないと,複数のシンボルが未定義になり,作成されるイメージは実行されません。

この修飾子を追加する場合, HP C RTL とリンクするために LNK$LIBRARY 論理名を使用することはできません。リンカ・オプション・ファイルを使用するか,コマンド・ラインに HP C RTL オブジェクト・ライブラリの一覧を指定する必要があります。次の例を参照してください。


$ LINK/NOSYSSHR PROG1, SYS$LIBRARY:DECCRTL.OLB/LIBRARY/INCLUDE=CMA$TIS
 
$ LINK/NOSYSSHR PROG1, SYS$LIBRARY:DECCRTL.OLB -
_$ /LIBRARY/INCLUDE=(CMA$TIS,CMA$TIS_VEC)  (OpenVMS V7.3 and higher) 

注意

  • /NOSYSSHR 修飾子を使用して HP C プログラムを HP C RTL オブジェクト・ライブラリに対してリンクする場合,未定義グローバルを含まずにすでにリンクされているアプリケーションでは, CMA$TIS シンボルに対して未定義グローバルが発生することがあります。これらの未定義グローバルを解決するには,次の行をリンク・オプション・ファイルに追加します。


    SYS$LIBRARY:STARLET.OLB/LIBRARY/INCLUDE=CMA$TIS 
     
    SYS$LIBRARY:STARLET.OLB/LIBRARY/INCLUDE=(CMA$TIS,CMA$TIS_VEC) 
     (OpenVMS V7.3 and higher) 
     
    

  • /NOSYSSHR 修飾子を使用してリンクしたプログラムで,動的に起動されるイメージ内に常駐するルーチンを呼び出し,そのルーチンが異常終了状態を示す値を返した場合は, errnoは ENOSYS に設定され, vaxc$errnoは C$_NOSYSSHR に設定されます。 C$_NOSYSSHR に対応するエラー・メッセージは "Linking /NOSYSSHR disables dynamic image activation" です。たとえば,ソケット・ルーチンを呼び出すプログラムを, /NOSYSSHR を使用してリンクすると,このような状況が発生します。

1.3.2 複数の C RTL によるリンク時競合の解決

ここでは,複数の C RTL を使用する場合に発生するリンク時競合を解決するための相互運用性ツールの使い方について説明します。

HP C RTL に移行する場合,アプリケーションをリンクするために複数の C RTL が必要になることがあります。 1 つの C RTL は明示的にリンクできます。 2 番目の C RTL を明示的にリンクすることはできませんが,共用可能イメージによってリンクすることができます。たとえば, HP C を使用して Motif プログラムを開発する場合,アプリケーションは HP C RTL および Motif イメージの両方に対してリンクしなければなりません。 Motif は現在,VAX C RTL をリンクします。

複数の C RTL とリンクすると, OpenVMS リンカは共用可能イメージおよびライブラリの過渡的なクローズを検索することにより,リンクされているイメージ内のシンボル参照を解決するので,問題が発生します。つまり,共用可能イメージとリンクする場合,リンカはその共用可能イメージの他に,その共用可能イメージ内で参照されているすべての共用可能イメージを検索します。したがって,VAXCRTL.EXE とリンクし, VAXCRTLG.EXE とリンクされたイメージとリンクする場合,リンカはすべての C RTL シンボルの 2 つのインスタンスを検索し (1 つは VAXCRTLから,もう 1 つは VAXCRTLG から ),競合を報告します。

オブジェクト・ライブラリとルーチン名の競合が発生することはありませんが,グローバル・シンボルとの競合は発生します。 VAX C ではグローバル・シンボルをグローバル・オーバーレイ psect としてインプリメントしているため,リンカは同じ名前の C 生成 psect のすべてのインスタンスを接続しようとします。たとえば,ユーザ・プログラム内の stdinに対する参照は, VAXCRTL.OLB 内の同じ名前の psect に接続されます。しかし,VAXCRTL.OLB とリンクされた共用可能イメージには,同じ名前の psect があります。この結果,リンカは psect stdinの 2 つの定義を接続することができないため,エラーが発生します。

リンク時に発生する競合を解決するために, HP C コンパイラおよび個別の HP C/ C++ RTL Run-Time Components キットで次の 3 つの相互運用性ツールが提供されています。

これらのツールは,競合するシンボルを,リンクされている C RTL の 1 つから隠すことにより動作します。どのツールが必要かは,メイン・アプリケーションおよび共用可能イメージでどの C RTL を使用するかに応じて異なります。

表 1-1 は,典型的な C RTL で発生する競合と,その競合を解決するのに必要な相互運用性ツールを示しています。この表で,VAXCRTL.EXE は VAXCRTL.EXE または VAXCRTLG.EXE を参照しています。

表 1-1 リンク時の競合
リンカ・メッセージ 競合の種類 必要なツール
LINK-E-MULSHRPSC VAXCRTL.OLB/VAXCRTL.EXE VAXC$LCL.OPT
LINK-E-SHRPSCLNG VAXCRTL.OLB/DECCRTL.OLB VAXC$LCL.OPT
LINK-E-MULSHRPSC,
LINK-E-SHRPSCLNG
DECCRTL.OLB/VAXCRTL.EXE VAXC$LCL.OPT
なし DECCRTL.OLB/DECC$SHR.EXE DECC$EMPTY
LINK-W-MULDEF VAXCRTL.EXE/VAXCRTLG.EXE VAXC$EMPTY
LINK-W-MULDEF VAXC2DECC.EXE/VAXCRTL.EXE VAXC$EMPTY

1.3.2.1 VAXC$LCL.OPT の使用

VAX C RTL オブジェクト・ライブラリまたは HP C RTL オブジェクト・ライブラリとリンクされた共用可能イメージを作成する場合は,VAXC$LCL.OPT が必要です。

VAXC$LCL.OPT を使用せずに共用可能イメージを作成した場合, C RTL グローバル・シンボルが共用可能イメージ内で有効になるため,イメージのユーザがリンクしたときに,リンカで競合が発生します。次の例を参照してください。


%LINK-E-MULSHRPSC, psect C$$TRNS_VALUES defined in 
        shareable image IMAGE1.EXE; is multiply defined in 
        shareable image SYS$LIBRARY:VAXCRTL.EXE;1 
-LINK-E-NOIMGFIL, image file not created 

この例では,共用可能イメージ IMAGE1 は VAXCRTL.OLB を使用し,リンクされているイメージは VAXCRTL.EXE を使用します。正しくリンクするには, VAXC$LCL.OPT を使用して共用可能イメージを再リンクする必要があります。


$ LINK/SHARE IMAGE1.OBJ, IMAGE1.OPT/OPTIONS, SYS$LIBRARY:VAXCRTL/LIBRARY, - _$ SYS$LIBRARY:VAXC$LCL.OPT/OPTIONS
 

次のメッセージも, VAX C RTL オブジェクト・ライブラリに関連する競合を示しています。


%LINK-E-SHRPSCLNG, Psect STDIN has length of 8 
        in module C$EXTERNDATA file SYS$LIBRARY:DECCRTL.OLB;2 
        which exceeds length of 4 in shareable image IMAGE1.EXE; 
-LINK-E-NOIMGFIL, image file not created 

この例では,共用可能イメージ IMAGE1 は VAXCRTL.OLB を使用し,リンクされているイメージは DECCRTL.OLB を使用します。正しくリンクするには,VAXC$LCL.OPT を使用して共用可能イメージを再リンクします。

共用可能イメージを再リンクできない場合は ( たとえばサード・パーティ共用可能イメージの場合など ),相互運用性ツールをメイン・イメージに適用します。メイン・イメージを DECCRTL.OLB に対してリンクすると,メイン・イメージのリンクに VAXC$LCL.OPT が適用されます。

メイン・イメージを VAXCRTL.EXE に対してリンクする場合は,メイン・イメージのリンクに相互運用性ツールを適用しても,リンクが正しく行われないため,問題を解決するには共用可能イメージを修正しなければなりません。

1.3.2.2 VAXC$EMPTY.EXE の使用

VAXCRTL.EXE( または VAXCRTLG.EXE) とリンクされた共用可能イメージ,および VAXC2DECC.EXE (または VAXCG2DECC.EXE) の両方とメイン・アプリケーションをリンクするには, VAXC$EMPTY.EXE を使用します。VAXC$EMPTY.EXE を使用すると, VAXCRTL*.EXE 共用可能イメージ内のすべてのグローバル・シンボルが隠されるため, VAXC2DECC.EXE または VAXCG2DECC.EXE との競合を防止できます。

また,VAXCRTLG.EXE とリンクされた共用可能イメージ,および VAXCRTL.EXE の両方 (またはその逆) とアプリケーションをリンクするには, VAXC$EMPTY.EXE を使用します。

C RTL 共用可能イメージ間に競合がある場合は,リンカは次のようなメッセージを数多く生成します。


%LINK-W-MULDEF, symbol ACOS multiply defined 
        in module VAXCRTL file SYS$COMMON:[SYSLIB]VAXCRTL.EXE;18 

この例では,共用可能イメージは VAXCRTL.EXE にリンクされ,メイン・プログラムは VAXC2DECC.EXE にリンクされます。

この問題を解決するには,メイン・プログラムをリンクする前に, VAXC$EMPTY.EXE を指すように VAXCRTL 論理名を定義します。


$ DEFINE/USER VAXCRTL SYS$LIBRARY:VAXC$EMPTY.EXE
$ LINK/EXEC=MAIN_IMAGE MAIN_PROG,OBJ1,OBJ2,...,SYS$INPUT:/OPTIONS
IMAGE1/SHARE
VAXCRTL/SHARE
[Ctrl/Z]

この解決法に関して,次のことに注意してください。

VAXCRTLG.EXE に対してリンクする場合も同じ処理を実行し, VAXC$EMPTY.EXE を指すように VAXCRTLG 論理名を定義します。

1.3.2.3 DECC$EMPTY.EXE の使用

DECC$EMPTY.EXE 相互運用性ツールを使用すると, DECC$SHR.EXE に対してリンクされた共用可能イメージとプログラムをリンクする場合でも,プログラムで HP C オブジェクト・ライブラリを使用できます。

リンク時に DECC$EMPTY.EXE を使用しないと,メイン・プログラムからのすべての HP C RTL 参照は,オブジェクト・ライブラリではなく,DECC$SHR.EXE で解決されます。この事実を示すリンカ・メッセージはありません。

たとえば,IMAGE1 は DECC$SHR に対してリンクされ,次のリンクが実行されると,メイン・イメージには HP C RTL オブジェクト・モジュールが含まれません。メイン・プログラムのすべての C RTL 参照は DECC$SHR で解決されます。


$ LINK/EXEC=MAIN_IMAGE MAIN_PROG,OBJ1,...,SYS$INPUT:/OPTIONS
IMAGE1/SHARE
SYS$LIBRARY:DECCRTL/LIBRARY
[Ctrl/Z]

リンクの直前に,DECC$EMPTY.EXE を指すように DECC$SHR 論理名を定義すると,メイン・プログラムからの C RTL シンボルに対するすべての参照は, HP C RTL オブジェクト・ライブラリで解決されるようになります。次の例を参照してください。


$ DEFINE/USER DECC$SHR SYS$LIBRARY:DECC$EMPTY.EXE
$ LINK/EXEC=MAIN_IMAGE MAIN_PROG,OBJ1,...,SYS$INPUT:/OPTIONS
IMAGE1/SHARE
SYS$LIBRARY:DECCRTL/LIBRARY

この解決法に関して,次のことに注意してください。


前へ 次へ 目次 索引