dllexport と dllimport の違いは何ですか?
-
09-06-2019 - |
質問
私はこれら 2 つの違いについての簡単で簡潔な説明を探しているだけです。MSDN では、ここではあまり詳しく説明していません。
解決
__declspec(dllexport)
このオブジェクトを他の DLL がインポートできるようにすることをリンカーに指示します。他の人がリンクできる DLL を作成するときに使用されます。__declspec(dllimport)
DLL から実装をインポートして、アプリケーションで使用できるようにします。
私は C/C++ 開発の初心者にすぎないので、おそらく誰かが私よりも詳しい説明を持っているでしょう。
他のヒント
__declspec( dllexport )
- タグ付けされたクラスまたは関数は、組み込まれている DLL からエクスポートされます。DLL を構築していて API が必要な場合は、これを使用するか、エクスポートを定義する別の .DEF ファイルを使用する必要があります (MSDN)。これは定義を 1 か所に保持できるため便利ですが、.DEF ファイルにはさらに多くのオプションが用意されています。
__declspec( dllimport )
- タグ付けされたクラスまたは関数は DLL からインポートされます。これは実際には必要ありません - インポート ライブラリが必要です ともかく リンカを幸せにするためです。しかし、適切にマークされている場合、 dllimport
, 、コンパイラとリンカーは呼び出しを最適化するのに十分な情報を持っています。これがないと、インポート ライブラリ内のスタブ関数への通常の静的リンクが得られ、不要な間接化が追加されます。 ONT1 ONT2
2 つの異なる使用例:
1) DLL 内でクラス実装を定義しています。別のプログラムでそのクラスを使用したいとします。ここでは、dll で公開するクラスを作成するときに dllexport を使用します。
2) DLL が提供する関数を使用している。DLL に付属のヘッダーを含めます。ここで、ヘッダーは dllimport を使用して、現在のプログラムで使用される実装を取り込みます。
多くの場合、両方のケースで同じヘッダー ファイルが使用され、マクロが定義されます。ビルド構成では、必要に応じてインポートまたはエクスポートするマクロを定義します。
Dllexport は、関数をエクスポート済みとしてマークするために使用されます。DLL に関数を実装し、エクスポートすると、DLL を使用する誰もがその関数を利用できるようになります。
Dllimport はその逆です。関数が DLL からインポートされたものとしてマークされます。この場合、関数のシグネチャを宣言し、コードをライブラリにリンクするだけです。