什么“CV_EXPORTS_W”的意思

时间:2012-08-23 01:31:55

标签: c++ opencv

最近,我尝试在OpenCV库中找到“calcOpticalFlowPyrLK”函数的源代码。当我搜索它的定义时,我发现了一个名为“CV_EXPORTS_W”的宏。有谁知道这意味着什么?

2 个答案:

答案 0 :(得分:6)

CV_EXPORTS_W is defined in modules/core/include/opencv2/core/types_c.h作为CV_EXPORTS的别名,并在同一文件中CV_EXPORTS is defined as

#if (defined WIN32 || defined _WIN32 || defined WINCE) && defined CVAPI_EXPORTS
# define CV_EXPORTS __declspec(dllexport)
#else
# define CV_EXPORTS
#endif

换句话说,它是Windows平台上__declspec(dllexport)的别名,其中CVAPI_EXPORTS已定义,否则为空。

答案 1 :(得分:3)

您可以使用__declspec(dllexport)关键字从DLL导出数据,函数,类或类成员函数。

Microsoft在Visual C ++的16位编译器版本中引入了__export,允许编译器自动生成导出名称并将它们放在.lib文件中。然后可以像使用静态.lib一样使用此.lib文件来链接DLL。

在较新的编译器版本中,您可以使用__declspec(dllexport)关键字从DLL导出数据,函数,类或类成员函数。 __declspec(dllexport)将导出指令添加到目标文件中,因此您不需要使用.def文件。

尝试导出已修饰的C ++函数名时,这种方便性最为明显。由于名称修饰没有标准规范,因此导出函数的名称可能会在编译器版本之间发生变化。如果使用__declspec(dllexport),则只需考虑任何命名约定更改,重新编译DLL和从属.exe文件。

许多导出指令(例如,序数,NONAME和PRIVATE)只能在.def文件中生成,如果没有.def文件,则无法指定这些属性。但是,除了使用.def文件之外,使用__declspec(dllexport)不会导致构建错误。

要导出函数,如果指定了关键字,则__ declspec(dllexport)关键字必须出现在calling-convention关键字的左侧。例如:

__ declspec(dllexport)void __cdecl Function1(void);

要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左侧,如下所示:

class __declspec(dllexport)CExampleExport:public CObject {...班级定义......};

NoteNote

__ declspec(dllexport)不能应用于具有__clrcall调用约定的函数。

构建DLL时,通常会创建一个包含要导出的函数原型和/或类的头文件,并将__declspec(dllexport)添加到头文件中的声明中。要使代码更具可读性,请为__declspec(dllexport)定义一个宏,并将宏用于要导出的每个符号:

定义DllExport __declspec(dllexport)

__ declspec(dllexport)将函数名称存储在DLL的导出表中。如果要优化表的大小,请参阅按顺序而不是按名称从DLL导出函数。