自动调用动态库:
正常我们的C++项目中静态调用的情况比较多,也就是我们通常所说的封装成一个动态库,然后把头文件,lib文件,dll文件给需要调用这个库的人,这种调用方式的好处是调用的人无需知道函数或功能的具体实现细节,只需要能理解库中函数的功能和参数传递就可以。缺点当然也有,比如如果库在开发前期考虑到的问题比较少,中途频繁更新,那么调用这个库的人就需要重新编译和更新用到这个库的代码模块.如果是修改的库的接口参数,则直接导致编译出错。还有个缺点就是你开发的工程在发布时候必须带上这个库的dll,这本没什么问题,但比较烦的是有些库命名很不规范,而且别人安装你的软件,一看安装目录的dll基本就能猜出你的软件用了哪些技术。
这种方式调用比较简单,这里就不讲具体实现细节。
静态库的方式:
静态库就是只生成lib文件,然后把lib文件和头文件给调用库的人,跟动态库动态调用不同的是静态库调用在软件发布的时候不用带上dll,它会把你的lib直接编译到你的exe或者dll中。静态库的方式比较适用于没有调用第三方dll库的情形,也就是说你在开发库的时候没有用到第三方动态库,否则编译库的时候会报各种错误.
手动调用动态库:
我们今天主要介绍动态库静态调用,简单来说就是生成了一个dll,你只要把这个dll给别人就可以,无需头文件和lib文件,之所以会用到这种情况主要是作者在实际的项目中有个算法模块,系统工程师开发了算法框架之后,算法工程师只需要在特定的算法框架中添加算法逻辑,然后把算法生成的dll放到特定的系统目录下,系统软件会自动把算法加载到软件中,这种需求的实现只能用动态库静态调用来实现。
首先我们建立一个动态库工程:
工程类型导出类型为dll。 Define.h文件定义导出的一些宏定义:
#pragma once
DllMain.h文件定义外部的调用接口:
#pragma once
DllMain.cpp 实现接口:
#include
AlgBase.h 实现图像算法的基类:
#pragma once
AlgROI头文件:
#pragma once
AlgROI.cpp文件:
#include
AlgPreProc头文件:
#pragma once
AlgPreProc.cpp文件:
#include
接下来我们新建一个exe的项目用来测试dll的调用:
#include