回答:
正規の例は__declspec(dllimport)
and __declspec(dllexport)
であり、DLLとの間でシンボルを(それぞれ)インポートおよびエクスポートするようリンカーに指示します。
// header
__declspec(dllimport) void foo();
// code - this calls foo() somewhere in a DLL
foo();
(__declspec(..)
Microsoft固有のものをラップするだけです-互換性を実現するために、通常はマクロでラップします)
.lib
は、一致するエクスポートされたシンボルを持つ最初のリンカを選択します。
__declspecキーワードを説明する別の例:
Windowsカーネルドライバーを作成しているときに、インラインアセンブラーコードを使用して独自のプロローグ/エピローグコードシーケンスを記述したい場合があるため、ネイキッド属性で関数を宣言できます。
__declspec( naked ) int func( formal_parameters ) {}
または
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
ネイキッド(C ++)を参照してください
基本的に、これは、標準のC ++の将来の拡張機能と競合しないようにMicrosoftがC ++拡張機能を導入する方法です。__declspecを使用すると、関数またはクラスに属性を付けることができます。正確な意味は、__ declspecの性質によって異なります。たとえば、__ declspec(naked)は、プロローグ/エピローグの生成を抑制し(割り込みハンドラー、埋め込み可能コードなど)、__ declspec(thread)は変数をスレッドローカルにします。
__declspec属性の完全なリストはMSDNで入手でき、コンパイラのバージョンとプラットフォームによって異なります。
GCC 4.2
自分に加えて、その提供の代替、__attribute__ ((dllexport))
にし__declspec(dllexport)
、それが呼び出しに公平である__declspec
、マイクロソフトのみの延長?
8年経っていることは知っていますが、MRubyにあるこのコードを共有__declspec()
して、と同じレベルでbee をどのように使用できるかを説明したいと思いますexport keyword
。
/** Declare a public MRuby API function. */
#if defined(MRB_BUILD_AS_DLL)
#if defined(MRB_CORE) || defined(MRB_LIB)
# define MRB_API __declspec(dllexport)
#else
# define MRB_API __declspec(dllimport)
#endif
#else
# define MRB_API extern
#endif
__declspec(dllexport)
、ライブラリの各関数の前に追加する必要があることがわかるまで、DLLが機能しない理由を理解するために時間を浪費する可能性があります