最近、OpenCVライブラリの「calcOpticalFlowPyrLK」関数のソースコードを見つけようとしています。その定義を検索したところ、「CV_EXPORTS_W」という名前のマクロが見つかりました。誰かがそれが意味することを知っていますか?
2 に答える
CV_EXPORTS_W
modules / core / include / opencv2 / core / types_c.hでのエイリアスとして定義されCV_EXPORTS
、同じファイルで次のCV_EXPORTS
ように定義されます。
#if (defined WIN32 || defined _WIN32 || defined WINCE) && defined CVAPI_EXPORTS
# define CV_EXPORTS __declspec(dllexport)
#else
# define CV_EXPORTS
#endif
__declspec(dllexport)
つまり、が定義されているWindowsプラットフォームのエイリアスでCVAPI_EXPORTS
あり、それ以外の場合は空です。
__declspec(dllexport)キーワードを使用して、DLLからデータ、関数、クラス、またはクラスメンバー関数をエクスポートできます。
Microsoftは、16ビットコンパイラバージョンのVisual C ++に__exportを導入し、コンパイラがエクスポート名を自動的に生成して.libファイルに配置できるようにしました。この.libファイルは、静的.libと同じように使用してDLLとリンクできます。
新しいバージョンのコンパイラでは、__ declspec(dllexport)キーワードを使用して、DLLからデータ、関数、クラス、またはクラスメンバー関数をエクスポートできます。__declspec(dllexport)は、エクスポートディレクティブをオブジェクトファイルに追加するため、.defファイルを使用する必要はありません。
この便利さは、装飾されたC++関数名をエクスポートしようとするときに最も明白になります。名前の装飾には標準の仕様がないため、エクスポートされた関数の名前はコンパイラのバージョン間で変わる可能性があります。__declspec(dllexport)を使用する場合、DLLと依存する.exeファイルの再コンパイルは、命名規則の変更を考慮するためにのみ必要です。
ordinals、NONAME、PRIVATEなどの多くのエクスポートディレクティブは、.defファイルでのみ作成でき、.defファイルなしでこれらの属性を指定する方法はありません。ただし、.defファイルの使用に加えて__declspec(dllexport)を使用しても、ビルドエラーは発生しません。
関数をエクスポートするには、キーワードが指定されている場合、__ declspec(dllexport)キーワードをcalling-conventionキーワードの左側に表示する必要があります。例えば:
__declspec(dllexport)void __cdecl Function1(void);
クラス内のすべてのパブリックデータメンバーとメンバー関数をエクスポートするには、次のように、キーワードをクラス名の左側に表示する必要があります。
class __declspec(dllexport)CExampleExport:publicCObject{...クラス定義...};
注注
__declspec(dllexport)は、__clrcall呼び出し規約のある関数には適用できません。
DLLをビルドするときは、通常、エクスポートする関数プロトタイプやクラスを含むヘッダーファイルを作成し、ヘッダーファイルの宣言に__declspec(dllexport)を追加します。コードを読みやすくするには、__ declspec(dllexport)のマクロを定義し、エクスポートする各シンボルでマクロを使用します。
DllExportを定義する__declspec(dllexport)
__declspec(dllexport)は、関数名をDLLのエクスポートテーブルに格納します。テーブルのサイズを最適化する場合は、名前ではなく序数でDLLから関数をエクスポートするを参照してください。