2011-01-10 21 views
5

をDLLIMPORT使用して、これは私のヘッダファイルがどのように見えるかです:私はこのヘッダファイルをインクルード.cppファイルで私はDLLを記述しようとしています手順

#ifndef _DLL_H_ 
#define _DLL_H_ 

#if BUILDING_DLL 
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */ 
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */ 


DLLIMPORT void HelloWorld (void); 


#endif /* _DLL_H_ */ 

、と私は、DLLのインポート手順をこのように宣言してみてください:

DLLIMPORT void HelloWorld() 
{ 
    MessageBox (0, "Hello World from DLL!n", "Hi", MB_ICONINFORMATION); 
} 

しかし、コンパイラは、(私はWindows 7の64ビットにMINGW32ている)私は、このエラーを与え続け:

E:\Cpp\Sys64\main.cpp|7|error: function 'void HelloWorld()' definition is marked dllimport| 
E:\Cpp\Sys64\main.cpp||In function 'void HelloWorld()':| 
E:\Cpp\Sys64\main.cpp|7|warning: 'void HelloWorld()' redeclared without dllimport attribute: previous dllimport ignored| 
||=== Build finished: 1 errors, 1 warnings ===| 

そして私は理由を理解していない。

+0

私は2つのアカウントをマージしましたので、今すぐ回答を受け入れることができます。 –

答えて

3

declspec(dllimport)は、モジュールのモジュールインポートテーブルにエントリを生成します。このインポートテーブルは、リンク時にシンボルへの参照を解決するために使用されます。ロード時に、これらの参照はローダによって固定されます。

declspec(dllexport)は、DLLのDLLエクスポートテーブルにエントリを生成します。さらに、宣言されているシンボル(関数、変数)を実装する必要があります。

DLLを実装しているので、BUILDING_DLLを定義する必要があります。これは#defineで行うことができますが、これはプロジェクト設定でより適切に設定する必要があります。

+1

コンパイラに '/ D BUILDING_DLL'を渡してください(これはもっと一般的なオプションです) – MSalters

+0

あなたは正しいです。これを答えに加えました。 – harper

2

私は実際にBUILDING_DLLを定義していないことを認識する前に、まったく同じエラーが発生しました。

したがって、DLLIMPORTは、__declspec (dllimport)であり、__declspec (dllexport)ではありません。シンボルを定義した後、問題は解決されました。コンパイラオプションとして

-DBUILDING_DLL 

、または単にあなたのファイルの先頭に

#define BUILDING_DLL 

を追加します。

あなたはMinGWのにしているので、次合格する必要があります。前者のほうがいいですが、-DBUILDING_DLLオプションをgccに渡す方法がわからない場合は、#defineソリューションのみを使用してください。

関連する問題