/EXPORT (関数のエクスポート)
関数を名前または序数 (またはデータ) でプログラムからエクスポートします。
構文
/EXPORT:<エントリ名>[,@<序数>[,NONAME]][,DATA]
解説
/EXPORT オプションを使うと、プログラムからエクスポートする関数またはデータ項目を指定できます。これにより、他のプログラムから関数を呼び出したり、データを使用したりできるようになります。 通常、エクスポートは DLL で定義されます。
<エントリ名> は、呼び出し元のプログラムによって使用される、関数またはデータ項目の名前です。 <序数> を使うと、1 から 65,535 の範囲でエクスポート テーブルへのインデックスを指定できます。<序数> を指定しない場合は、LINK によって割り当てられます。 NONAME キーワードを使用すると、関数はただ序数として、<エントリ名> なしでエクスポートされます。
DATA キーワードでは、エクスポートされた項目がデータ項目であることを指定できます。 クライアント プログラムのデータ項目は、extern __declspec(dllimport) を使って宣言する必要があります。
定義をエクスポートするには次の 4 つの方法があり、使用をお勧めする順に示します。
ソース コードでの __declspec(dllexport)
.def ファイルでの EXPORTS ステートメント
LINK コマンドでの /EXPORT の指定
ソース コードでの comment ディレクティブ (形式は
#pragma comment(linker, "/export: definition ")
)。
同じプログラム内でこれらすべての方法を使用できます。 エクスポートを含むプログラムが LINK によってビルドされる際に、ビルドで .exp ファイルが使用されていない限り、インポート ライブラリも作成されます。
LINK では、識別子の装飾形式が使用されます。 コンパイラは、.obj ファイルを作成するときに識別子を装飾します。 <エントリ名> がリンカーに対して非装飾形式で (ソース コードに示されているように) 指定されている場合、LINK によって名前の照合が試みられます。 一意の一致が見つからない場合、LINK からエラー メッセージが表示されます。 リンカーに指定する必要がある場合は、DUMPBIN ツールを使って識別子の装飾名形式を取得します。
Note
__cdecl
または __stdcall
として宣言されている C 識別子の装飾形式は指定しないでください。
関数の非装飾名をエクスポートする必要があり、ビルドの構成 (たとえば、32 ビット ビルドか 64 ビット ビルドか) によってエクスポートが異なる場合は、構成ごとに異なる DEF ファイルを使用できます。 (プリプロセッサの条件付きディレクティブは DEF ファイルでは使用できません)。別の方法として、次に示すように、関数宣言の前に #pragma comment
ディレクティブを使用できます。ここで、 PlainFuncName
は非装飾名、 _PlainFuncName@4
は関数の修飾名です。
#pragma comment(linker, "/export:PlainFuncName=_PlainFuncName@4")
BOOL CALLBACK PlainFuncName( Things * lpParams)
Visual Studio 開発環境でこのリンカー オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[リンカー]>[コマンド ライン] プロパティ ページを選択します。
[追加のオプション] ボックスにオプションを入力します。
このリンカーをコードから設定するには
- 以下を参照してください。AdditionalOptions