web-dev-qa-db-ja.com

__declspec(dllimport)とはどういう意味ですか?

次のようなQtソースコードを見ました。

_class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
_

どの_Q_CORE_EXPORT_マクロは以下のように定義します:

_define Q_DECL_IMPORT __declspec(dllimport)
_

__declspec(dllimport)はどういう意味ですか?

78
gemfield

___declspec_ は、ストレージクラス情報を指定できるMicrosoft固有の属性です。
(Nitpicker's Corner:ただし、他の多くのコンパイラベンダー(GCCなど)は、Microsoftのコンパイラを対象に記述されたインストール済みのコードベースとの互換性のために、この言語拡張機能をサポートしています。

指定できるストレージクラス属性の2つは、dllimportdllexportです。これらは、関数またはオブジェクトが(それぞれ)DLLからインポートまたはエクスポートされることをコンパイラーに示します。

より具体的には、モジュール定義(_.DEF_)ファイルを必要とせずに、クライアントへのDLLのインターフェースを定義します。ほとんどの人は、DEFファイルを作成するよりもこれらの言語拡張機能を使用する方がはるかに簡単だと感じています。

明らかな理由により、__declspec(dllimport)__declspec(dllexport)は通常、互いにペアになっています。 dllexportを使用して、DLLからエクスポートされたシンボルをマークし、dllimportを使用して、エクスポートされたシンボルを別のファイルにインポートします。

このため、およびDLLをコンパイルするときと、DLLのインターフェイスを使用するクライアントコードの両方で同じヘッダーファイルが通常使用されるため、自動的に解決されるマクロを定義するのが一般的なパターンです。コンパイル時の適切な属性指定子例:

_#if COMPILING_DLL
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif
_

そして、DLLEXPORTでエクスポートされるすべてのシンボルにマークを付けます。

おそらく、それは_Q_CORE_EXPORT_マクロが行うことであり、_Q_DECL_IMPORT_または_Q_DECL_EXPORT_のいずれかに解決されます。

101
Cody Gray

__declspec(dllimport)は、関数、オブジェクト、またはデータ型が外部DLLで定義されていることをコンパイラに伝えるストレージクラス指定子です。

関数、オブジェクト、またはデータ型は、対応する__declspec(dllexport)とともにDLL)からエクスポートされます。

22
arx

これは、関数の定義が動的ライブラリにあることを意味します。詳細と例については、 ドキュメント を参照してください。

1
Armen Tsirunyan