1. ホーム
  2. c++

[解決済み] __declspec(dllimport) の本当の意味は何ですか?

2022-12-07 19:52:59

質問

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 つです。 dllimportdllexport . これらは、関数やオブジェクトがDLLからインポートまたはエクスポートされていることをコンパイラに示すものです(それぞれ)。

より具体的には、これらはモジュール定義( .DEF ) ファイルを必要としません。ほとんどの人は、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 .