6

重複の可能性:
Windows & C++: extern & __declspec(dllimport)
なぜ/いつ __declspec( dllimport ) が必要ないのですか?

DLL プロジェクトを作成したいと考えています。このプロジェクトには、いくつかの DLL が含まれています。それらは依存しています。次のようないくつかのマクロを定義します。

#ifdef  MYDLL_DECL1
    #define  DLL_DECL __declspec(dllexport)
#else
    #define DLL_DECL __declspec(dllimport)
#endif

モジュールごとに MYDLL_DECL1...MYDLL_DECLn を定義しました。同じマクロを定義しても動かないと思ったからです。しかし、本当にマクロを 1 つだけ定義したいので、テストベッドを作成しました。私は2つのモジュールを持っています。2番目のモジュールのソースファイル。次のようなコードを書きます。

#define  MYDLL_DECL
#include "moudle1.h"
#include "moudle2.h"

同じマクロ名「MYDLL_DECL」を使用すると、modle1 のヘッド ファイルに「MYDLL_DECL」が定義されているため、「DLL_DECL」は「__declspec(dllexport)」と等しくなります。実際には、module2 では "__declspec(dllimport)" と等しいはずです。module2 は module1 をインポートするためです。 しかし、2 つのモジュールに対して同じマクロを定義するだけで機能することがわかりました。また、OpenCVもこのメソッドをそのライブラリに使用していることがわかります

4

1 に答える 1

6

まず、マクロなしで何が必要かを考えます。__declspec(dllexport)クラスまたは関数が module1 で定義されている場合は、それを module1 および__declspec(dllimport)他のすべてのモジュールで宣言する必要があり ます。それが宣言されているヘッダーファイルに含めます。

2 つの異なるヘッダー ファイルを保持したくないし、あらゆる場所で条件付きコンパイルを実行したくないため、最適な解決策は条件付きで定義されたマクロを使用することです。たとえば、次のようになります。

#ifdef MODULE1
#define MODULE1_DECL __declspec(dllexport)
#else
#define MODULE1_DECL __declspec(dllimport)
#endif

コンパイラを呼び出すときMODULE1は、プロジェクト module1 でのみ定義します。他のプロジェクトでは定義しません。したがって、module1 をコンパイルすると にMODULE1_DECL展開され__declspec(dllexport)、他のモジュールをコンパイルすると に展開され__declspec(dllimport)ます。

于 2012-07-23T07:45:27.747 に答える