私はこのようなQtソースコードを見ました:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Q_CORE_EXPORT
以下のように定義するマクロ:
define Q_DECL_IMPORT __declspec(dllimport)
では、__declspec(dllimport)
実際にはどういう意味ですか?
私はこのようなQtソースコードを見ました:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Q_CORE_EXPORT
以下のように定義するマクロ:
define Q_DECL_IMPORT __declspec(dllimport)
では、__declspec(dllimport)
実際にはどういう意味ですか?
__declspec
ストレージクラス情報を指定できるMicrosoft固有の属性です。
(Nitpicker's Corner:ただし、GCCなどの他の多くのコンパイラベンダーは、Microsoftのコンパイラを対象として作成されたコードのインストールベースとの互換性のために、この言語拡張をサポートしています。一部のベンダーは、追加のストレージクラス属性を提供しています。)
指定できるストレージクラス属性の2つはとdllimport
ですdllexport
。これらは、関数またはオブジェクトがDLLから(それぞれ)インポートまたはエクスポートされることをコンパイラーに示します。
具体的には、module-definition(.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
。
__declspec(dllimport)
関数、オブジェクト、またはデータ型が外部 DLL で定義されていることをコンパイラに伝えるストレージ クラス指定子です。
関数、オブジェクト、またはデータ型は、対応する DLL からエクスポートされます__declspec(dllexport)
。
これは、関数の定義がダイナミックライブラリにあることを意味します。詳細と例については、ドキュメントを参照してください。