14
#if COMPILING_DLL
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif

どのように/どこで定義しますCOMPILING_DLLか?

ここで見られる: __ declspec(dllimport)は実際にはどういう意味ですか?

同じヘッダーを使用できない場合、ロード時のダイナミックリンクをまったく使用できないように聞こえますか?

ここに画像の説明を入力してください

4

7 に答える 7

14

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

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

于 2013-02-20T13:16:02.543 に答える
2

#defineDLL プロジェクトで、 (ヘッダー ファイルまたはプロジェクト プロパティのいずれかに) を追加しますCOMPILING_DLL。これは他のプロジェクトには設定されないため (特に、より適切な名前を付けた場合COMPILING_DLL)、#ifディレクティブは適切に機能します。

于 2013-02-20T13:14:23.337 に答える
2

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

于 2013-02-20T13:16:05.803 に答える
1

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

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

ヘッダーファイルで:

extern DLLEXPORT void test2();

.cpp ファイル:

void test2()
{
   // ...
}

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

于 2013-02-20T13:45:05.827 に答える
1

実際、本当の問題はプリプロセッサ ディレクティブです。#ifdef変数が実際に定義されているかどうかをテストするために and notを使用する必要が#ifあります (定義された値や存在するかどうかは気にしません)。

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

于 2014-01-23T17:18:48.710 に答える