インポート・ライブラリーとエクスポート・ファイルの使用

プログラム (実行形式ファイルまたは DLL) が別のプログラムに対してエクスポートを行っており,同時にそのプログラムからインポートも行っている場合,または 3 つ以上のプログラムが互いにエクスポートとインポートの両方を行っている場合,これらのプログラムをリンクするコマンドは循環的なエクスポートに対応しなくてはなりません。

循環的なエクスポートが行われていない場合,他のプログラムからのエクスポートを使用しているプログラムをリンクするときには,エクスポート側のプログラムのインポート・ライブラリーを指定する必要があります。エクスポート側のプログラムのインポート・ライブラリーは,そのエクスポート側のプログラムをリンクするときに作成されます。したがって,インポート側のプログラムをリンクする前に,エクスポート側のプログラムをリンクしなければならないということになります。たとえば,TWO.DLLONE.DLL からインポートを行っている場合,まず ONE.DLL をリンクして,インポート・ライブラリー ONE.LIB を作成する必要があります。その後,TWO.DLL をリンクするときに ONE.LIB を指定します。リンカーは,TWO.DLL を作成するときに,インポート・ライブラリー TWO.LIB も作成します。TWO.LIB は,TWO.DLL からインポートを行うプログラムをリンクするときに使用されます。

しかし,循環的なエクスポートが行われている場合には,相互に依存しているすべてのプログラムを,他のプログラムからのインポート・ライブラリーを使ってリンクするということは不可能になります。上の例でいえば,TWO.DLL がやはり ONE.DLL にエクスポートしていたとすると,TWO.DLL のインポート・ライブラリーは ONE.DLL がリンクされる時点ではまだ存在していません。循環的なエクスポートが行われている場合,LIB を使って,いずれかのプログラムのインポート・ライブラリーとエクスポート・ファイルを作成する必要があります。

最初に,LIB の実行の対象とするプログラムを 1 つ選びます。LIB コマンドで,そのプログラムのすべてのオブジェクトとライブラリーを指定し,/DEF オプションを指定します。プログラムが .DEF ファイルまたは /EXPORT 指定を使用する場合,これらも指定します。

プログラムのインポート・ライブラリー (.LIB) とエクスポート・ファイル (.EXP) を作成したら,他のプログラムをリンクする際に,そのインポート・ライブラリーを使用します。LINK は,ビルドした個々のエクスポート側プログラムについてインポート・ライブラリーを作成します。たとえば,ONE.DLL のオブジェクトとエクスポートに対して LIB を実行すると,ONE.LIBONE.EXP が作成されます。これで,TWO.DLL をリンクするときに ONE.LIB が使用できるようになります。この手順ではインポート・ライブラリー TWO.LIB も作成されます。

最後に,最初に処理したプログラムのリンクを行います。LINK コマンドでは,プログラムのオブジェクトとライブラリー,そのプログラムに対して LIB が作成した .EXP ファイル,およびそのプログラムが使用するエクスポートのためのインポート・ライブラリーを指定します。上の例を続けると,ONE.DLL のための LINK コマンドでは,ONE.EXPTWO.LIB,さらに ONE.DLL, に格納されるオブジェクトとライブラリーを指定します。LINK コマンドでは .DEF ファイルと /EXPORT 指定は指定しません。エクスポート定義は .EXP ファイルに含まれているからです。.EXP ファイルを使ってリンクを行うと,LINK は,.EXP ファイルが作成された時点でインポート・ライブラリーが作成されていると判断し,インポート・ライブラリーの作成は行いません。