最近,我尝试在OpenCV库中找到“calcOpticalFlowPyrLK”函数的源代码。当我搜索它的定义时,我发现了一个名为“CV_EXPORTS_W”的宏。有谁知道这意味着什么?
答案 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)定义一个宏,并将宏用于要导出的每个符号:
__ declspec(dllexport)将函数名称存储在DLL的导出表中。如果要优化表的大小,请参阅按顺序而不是按名称从DLL导出函数。