2013-02-20 10 views
5
#if COMPILING_DLL 
    #define DLLEXPORT __declspec(dllexport) 
#else 
    #define DLLEXPORT __declspec(dllimport) 
#endif 

どのように/ COMPILING_DLLを定義しますか?ここで見dllexport/dllimportスイッチのマクロ

:私は同じヘッダを使用することができない場合、私は全く負荷時のダイナミックリンクを使用することはできませんように what does __declspec(dllimport) really mean?

サウンズ? DLLプロジェクトで

enter image description here

+0

は、あなたがどこかにいくつかの奇妙な間違いを持っ​​ているようですそれはここで言及されていません。安心して、それは動作するはずです、DLLは非常に便利です。 –

答えて

8

COMPILING_DLL=1を定義するのに最適な場所は、コンパイラのコマンドラインです。 Visual Studio IDEを使用している場合は、プロジェクトプロパティ... C/C++ ...プリプロセッサ...プリプロセッサの定義にあります。

__declspec(dllimport)は、C++のMicrosoft固有の拡張です。 Microsoftには優れたオンラインドキュメントがあります。

+1

プリプロセッサの定義にCOMPILING_DLLを追加しましたが、それでも "エラーC2491: 'test2':dllimport関数の定義が許可されていません。これは意味をなさない。なぜなら、Visual Studioは今、正しいものを灰色にしてしまうからだ。これを説明するスクリーンショットを追加しました。 – Blub

+0

手動で '#define COMPILING_DLL 1'を実行すると動作します – Blub

+0

DLLプロジェクトのプリプロセッサ定義にCOMPILING_DLLを追加する必要があります。そのヘッダーがそのプロジェクトのプリコンパイル済みヘッダーに含まれている場合は、再構築してください。 –

2

、あなたはCOMPILING_DLL用(ヘッダファイル内またはプロジェクトのプロパティでいずれか)#defineを追加します。これは他のプロジェクトには設定されないので(特にCOMPILING_DLLよりも優れた名前を付けた場合)、#ifディレクティブが正しく動作します。

2

DLL(実際にはVisual Studioの理想的な場合)は、DLLをビルドするときにコンパイラの引数としてCOMPILING_DLLを定義します。したがって、デフォルトは__declspec(dllexport)になります。もう一方で、DLLのヘッダーファイルを使用する場合、これを定義しないので、DLLEXPORTはデフォルトで__declspec(dllimport)と評価されます。

0

ヘッダーファイルでそのように関数本体を定義することはできません。それはprohibited by __declspec(dllimport)です。この指定子は、定義ではなく関数宣言でのみ指定できます。

関数本体をソースファイルに移動する必要があります。 .cppファイルで

extern DLLEXPORT void test2(); 

:ヘッダファイル内

void test2() 
{ 
    // ... 
} 

人々は、プロジェクトのプリプロセッサ定義にCOMPILING_DLLを追加することを忘れないでください、言ったように。

+0

でも動作しますが、VS2010。 – Blub

+0

あなたが言及したコンパイラエラーのソース(「エラーC2491: 'test2':dllimport関数の定義は許可されていません」)はこれでした。しかし、それを明示的に '#define COMPILING_DLL'をコードに追加するのではなく、それを明示的に使って解決できるようです:Project> properties> C/C++> Preprocessor> Preprocessor Definitions –

1

実際、実際の問題はプリプロセッサディレクティブです。 変数が実際に定義されているかどうかをテストするには#ifdefを使用し、#ifを使用しないでください(定義された値があるかどうか、またはある場合)。

注:私はこのスレッドが1歳であることを知っていますが、将来この問題を抱える人にとってはまだ役立つかもしれません。

4

一つ別のオプション:

プロジェクトにローカルマクロ定義されてデフォルトを使用してください。

あなたは、以下の場所でのプロジェクトへのローカルのデフォルト定義されたマクロを参照することができます

プロパティ - > C/C++ - >プリプロセッサ - >プリプロセッサ定義を。例

とし、あなたのプロジェクト名は次のとおりです。MYDLL

デフォルトそのプロジェクトへのローカルマクロ:MYDLL_EXPORTS

#ifdef MYDLL_EXPORTS 
    /*Enabled as "export" while compiling the dll project*/ 
    #define DLLEXPORT __declspec(dllexport) 
#else 
    /*Enabled as "import" in the Client side for using already created dll file*/ 
    #define DLLEXPORT __declspec(dllimport) 
#endif