7

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

4

2 回答 2

7

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,否则为空。

于 2012-08-23T02:09:31.870 回答
4

您可以使用 __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) 关键字必须出现在调用约定关键字的左侧。例如:

__declspec(dllexport) 无效 __cdecl Function1(void);

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

类 __declspec(dllexport) CExampleExport : public CObject { ... 类定义 ... };

注意注意

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

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

定义 DllExport __declspec( dllexport )

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

于 2014-12-29T11:52:29.503 回答