OpenCV中的CV_EXPORT是什么意思

今天在看OpenCV模板匹配的源代码,发现,C/C++能力退化了不少,后期需要补课了。

OpenCV中的CV_EXPORT是什么意思_第1张图片


在名的前面加了一个 CV_EXPORTS,觉得好奇怪,这是什么东西,怎么感觉以上在书本上都没看到过。


首先,我们跟踪代码,看看,CV_EXPORTS具体是什么:




也就是说,CV_EXPORTS 实际上就是 __declspec(dllexport),查阅google可以发现,其作用如下:

        使用 __declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。
        __declspec(dllexport) 会将导出指令添加到对象文件中,因此在指定的对象文件里您不需要使用 .def 文件。

当试图导出 C++ 修饰函数名时,这种便利最明显。由于对名称修饰没有标准规范,因此导出函数的名称在不同的编译器版本中可能有所变化。如果使用 __declspec(dllexport),仅当解决任何命名约定更改时才必须重新编译 DLL 和依赖 .exe 文件。


若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边。由于对名称修饰没有标准规范,因此导出函数的名称在不同的编译器版本中可能有所变化。如果使用 __declspec(dllexport),仅当解决任何命名约定更改时才必须重新编译 DLL 和依赖 .exe 文件。


许多导出指令(如序号、NONAME 和 PRIVATE)只能在 .def 文件中创建,并且必须使用 .def 文件来指定这些属性。不过,在 .def 文件的基础上另外使用 __declspec(dllexport) 不会导致生成错误。


生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将 __declspec(dllexport) 添加到头文件中的声明中。若要提高代码的可读性,请为 __declspec(dllexport) 定义一个宏并对正在导出的每个符号使用该宏:

#define DllExport   __declspec( dllexport ) 

其他概念:
动态链接库中定义有两种函数:导出函数(export   function)和内部函数(internal   function)。 
导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。 


MFC提供的修饰符号_declspec(dllexport) 就是表示导出函数或变量。


模块定义文件(.DEF)是一个或多个用于描述DLL属性的模块语句组成的文本文件。


----------------------------------------------------------




lib与dll的区别:
1. 使用方式有什么不同?
2. 原因是什么?


其实lib无论怎么样,都会用到。
一种是lib单独使用,另外一种是lib+dll的方式(平时所说的dll的方式)。
lib单独使用:
1. LIB包含函数代码本身,不仅包含头文件,还有源码,在编译时直接将代码加入程序当中,称为静态链接库static link library。链接生成的程序可以独立运行。


    即lib文件是静态编译出来的,索引和实现都在其中。
2. 同一机器,多个同种程序运行,每个程序都会加载一份代码库。


3. 任何改动,都需要重新编译、链接,这个对大型的程序非常不便,升级也麻烦。有时,在更改数据结构时,需要重新编译整个工程,而非只编译、链接单个lib。




lib+dll方式:
1. LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。生成的程序需要dll配合使用。
    即lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容。应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。
2. 多个程序运行,共享一份代码。节省内存。
3. 当 DLL 中的函数发生更改时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。






使用方式的差别:


1. 静态lib
需要.h和lib。
在生成lib时,相当于cpp编译的obj的集合。链接时,指定lib的位置。


2. 动态lib
实质上是dll的使用方式。
在生成dll时,会生成一个lib,lib里包含的是索引信息。
编译链接时,需要.h,lib。
运行时,需要程序和dll。


REF:

http://blog.csdn.net/viewcode/article/details/8021989

https://msdn.microsoft.com/zh-cn/library/a90k134d(v=vs.80).aspx





你可能感兴趣的:(OpenCV学习笔记)