10.23 __declspec(dllexport)

__declspec(dllexport) 属性は、DLL ライブラリのビルド時に、ダイナミックシンボルテーブルからシンボルの定義をエクスポートします。クラスに適用した場合、vtables、construction vtable、RTTI など、クラスの付帯変数の可視性を制御し、メンバ関数およびスタティックデータメンバのデフォルトの可視性を設定します。

使用法

__declspec(dllexport) は、関数、クラス、またはクラスの個々のメンバに使用できます。
インライン関数が __declspec(dllexport) としてマークされると、関数定義はインライン展開される場合がありますが、非インライン関数と同様に、関数のアウトオブラインインスタンスが常に生成され、エクスポートされます。
クラスが __declspec(dllexport) としてマークされていると(たとえば class __declspec(dllexport) S { ...};)、そのスタティックデータメンバとメンバ関数がすべてエクスポートされます。個々のスタティックデータメンバとメンバ関数が __declspec(dllexport) としてマークされていると、それらのメンバのみがエクスポートされます。vtable、construction vtable テーブル、および RTTI もエクスポートされます。

以下の宣言は正しい例です。
class __declspec(dllexport) S { ...};
以下の宣言は誤った例です。
__declspec(dllexport) class S { ...};
--export_all_vtbl との組み合わせで __declspec(notshared) を使用することによって、クラスまたは構造体のエクスポートから vtable、construction vtable テーブル、および RTTI を除外することができます。通常、--export_all_vtbl__declspec(dllexport) を組み合わせて使用することはしません。

制約条件

クラスを __declspec(dllexport) でマークした場合、そのクラスの個々のメンバを __declspec(dllexport) でマークすることはできません。
クラスを __declspec(dllexport) でマークする場合は、そのクラスのすべてのベースクラスが __declspec(dllexport) でマークされている必要があります。
クラス内の仮想関数をエクスポートする場合、そのクラスのすべての仮想関数をエクスポートするか、または、クライアントから見えるようにそれらの仮想関数をインラインで定義する必要があります。

宣言に必要な __declspec() は、その定義が同じ共有ライブラリに存在するかどうかによって異なります。
/* This is the declaration for use in the same shared library as the */
/* definition */
__declspec(dllexport) extern int mymod_get_version(void);
/* Translation unit containing the definition */
__declspec(dllexport) extern int mymod_get_version(void)
{
   return 42;
}
/* This is the declaration for use in a shared library that does not contain */
/* the definition */
__declspec(dllimport) extern int mymod_get_version(void);
以下のマクロによって、定義を含んだリンクユニット内の、定義を含まない変換単位から、__declspec(dllexport) が見えるようになります。
/* mymod.h - interface to my module */
#ifdef BUILDING_MYMOD
#define MYMOD_API __declspec(dllexport)
#else /* not BUILDING_MYMOD */
#define MYMOD_API __declspec(dllimport)
#endif
MYMOD_API int mymod_get_version(void);
関連する参考文書
10.24 __declspec(dllimport)
10.28 __declspec(notshared)
8.78 --export_all_vtbl、--no_export_all_vtbl
8.196 --visibility_inlines_hidden
関連情報
--use_definition_visibility リンカオプション
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.