创建基于opencv处理功能的动态链接库

1.LIB和DLL

关于lib和dll的区别如下:
(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。
(3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。

2.采用MFC的共享链接库可以很方便的创建一个动态链接库,需要作为外部参数的可以在前面加上 __declspec(dllexport)

一般都会这样处理:
                                  #ifdef DLL_IMPLEMENT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif


MFC下默认都是C++,由于C++的函数有重载,如果外部不是采用C++的话,使用这个可能会有问题,这个时候可以使用 extern "C" { 来提醒编译器采用C编译器进行编译。
所以总的模板为:
#ifdef DLL_IMPLEMENT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
#ifdef __cplusplus    //__cplusplus是cpp中自定义的一个宏
extern "C" {          //告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的
#endif 
DLL_API  Fun();/*供外部使用函数*/
#ifdef __cplusplus
}
#endif

对于opencv编写特定功能的dll的时候,为了使外部在使用这个dll时很方便(用户不需要知道opencv),这个时候导出函数和其他opencv处理函数分别在不同的.h文件中进行声明。

现在假如有以下几个函数: fun1(), fun2().fun3(),fun4(),这里假设fun1是提供给外部的函数,那么这个函数的参数不要包含opencv的数据结构比如Mat,Point等,这样dll和外部的主程序就很好的解耦了,将fun1放在f1.h中,其它几个可以放到f2.h中,f2.h只是一个内部的.h文件,然后内部还有一个cpp来做具体的实现。内部的函数还是采用C++的编译器进行编译,f1.h是给外部看到的头文件,则f1.h的模板格式为:
#ifndef F1_H
#define F1_H
#include<iostream>
#ifdef DLL_IMPLEMENT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
#ifdef __cplusplus    //__cplusplus是cpp中自定义的一个宏
extern "C" {          //告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的
#endif 
DLL_API  fun1()
#ifdef __cplusplus
}
#endif
#endif
生成好了lib和dll之后就只需要将这lib拷贝到对应的工下,用#pragma comment(lib, "a.lib"),加上头文件就可以使用编译了,编译之后将前面的dll和opencv的dll放到debug或者realse下面就可以运行exe文件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值